From a85b25f04f6ba5bb45c116927c9e5d0e4639dc97 Mon Sep 17 00:00:00 2001 From: phil <phil> Date: Fri, 25 Jul 2003 18:10:53 +0000 Subject: [PATCH] merge b_devel into HEAD, which will become 0.7.3 - dozens and dozens of fixes for working with 2.6 kernels - new 2.4 kernel APIs - uncountable bug fixes --- lnet/tests/Makefile.mk | 9 + lnet/utils/Makefile.mk | 6 + lustre/include/linux/lustre_commit_confd.h | 73 + lustre/include/linux/lustre_log.h | 81 + lustre/include/linux/lustre_mgmt.h | 34 + lustre/include/linux/obd_filter.h | 104 - .../kernel_configs/kgdb-vmware-2.5.73 | 908 + .../patches/2.6.0-test1-mm2.patch | 179799 +++++++++++++++ .../kernel_patches/patches/dump_netdev.patch | 340 + .../patches/ext3-2.4.18-fixes.patch | 353 - .../patches/ext3-2.5-noread.patch | 266 - .../kernel_patches/patches/ext3-2.5.63.patch | 150 - .../patches/ext3-error-export.patch | 16 + .../patches/ext3-map_inode_page.patch | 84 + .../patches/ext3-map_inode_page_2.4.18.patch | 86 + .../patches/ext3-noread-inode.patch | 177 + ...-san.patch => ext3-san-jdike-2.5.73.patch} | 26 +- .../ext3-truncate_blocks-chaos.patch.patch | 92 - .../ext3_delete_thread_2.4.20_chaos.patch | 477 + .../patches/extN-delete_thread.patch | 278 - .../patches/extN-iget-debug.patch | 48 - .../patches/gpl_header-chaos-2.4.20.patch | 11 + .../inode-protection-from-pdflush.patch | 29 + .../invalidate_show_2.4.20_chaos.patch | 112 + .../kernel_patches/patches/iopen-2.5.73.patch | 403 + .../patches/jbd-transno-cb.patch | 240 - .../patches/kexec-2.5.73-full.patch | 1479 + .../patches/kexec-2.6.0-full.patch | 1428 + .../patches/kgdb-ga-2.5.73.patch | 5046 + .../patches/kgdb-ga-docco-fixes-2.5.73.patch | 347 + .../patches/kgdb-use-ggdb-2.5.73.patch | 17 + .../patches/lkcd-cvs-2.5.69.patch | 6418 + .../patches/lkcd-kernel-changes-2.5.73.patch | 608 + .../lkcd-kernel-changes-2.6.0-test1.patch | 588 + .../patches/lustre-2.5.63.patch | 862 - .../kernel_patches/patches/lustre_build.patch | 33 + .../patches/netconsole_sysrq.patch | 41 - .../patches/qla2xxx-v8.00.00b1-2.5.73.patch | 58389 +++++ .../patches/tcp_zero_copy_2.4.20_chaos.patch | 459 + .../patches/tg3_netconsole.patch | 247 - ....4.20-4.patch => uml-patch-2.4.20-6.patch} | 6406 +- .../patches/uml_compile_fixes.patch | 18 - ...tch => vfs_intent-2.4.18-18-chaos65.patch} | 955 +- .../patches/vfs_intent-2.4.20-hp.patch | 1793 + .../patches/vfs_intent_2.4.20_chaos.patch | 1716 + .../patches/vfs_intent_2.5.72_rev1.patch | 1031 + .../patches/vfs_intent_2.6.0-test1.patch | 764 + .../patches/vfs_mntcwd_2.5.72_rev1.patch | 0 .../patches/vfs_nointent_2.5.69_rev1.patch | 409 + .../patches/vfs_races_2.5.72_rev1.patch | 83 + lustre/kernel_patches/pc/2.6.0-test1-mm2.pc | 1202 + lustre/kernel_patches/pc/dump_netdev.pc | 9 + lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc | 7 - lustre/kernel_patches/pc/ext3-2.5.63.pc | 4 - lustre/kernel_patches/pc/ext3-error-export.pc | 1 + .../kernel_patches/pc/ext3-map_inode_page.pc | 3 + .../pc/ext3-map_inode_page_2.4.18.pc | 3 + ...xt3-2.5-noread.pc => ext3-noread-inode.pc} | 0 .../{extN-san.pc => ext3-san-jdike-2.5.73.pc} | 0 .../pc/ext3-truncate_blocks-chaos.patch.pc | 1 - ....pc => ext3_delete_thread_2.4.20_chaos.pc} | 4 +- lustre/kernel_patches/pc/extN-iget-debug.pc | 2 - .../pc/gpl_header-chaos-2.4.20.pc | 1 + .../pc/inode-protection-from-pdflush.pc | 2 + .../kernel_patches/pc/inode-unhash_2.5.75.pc | 2 + .../pc/invalidate_show_2.4.20_chaos.pc | 4 + lustre/kernel_patches/pc/iopen-2.5.73.pc | 8 + lustre/kernel_patches/pc/jbd-transno-cb.pc | 4 - lustre/kernel_patches/pc/kexec-2.5.73-full.pc | 23 + lustre/kernel_patches/pc/kexec-2.6.0-full.pc | 23 + lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc | 28 + .../pc/kgdb-ga-docco-fixes-2.5.73.pc | 1 + .../kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc | 1 + lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc | 19 + .../pc/lkcd-kernel-changes-2.5.73.pc | 25 + .../pc/lkcd-kernel-changes-2.6.0-test1.pc | 25 + lustre/kernel_patches/pc/lustre_build.pc | 5 + lustre/kernel_patches/pc/netconsole_sysrq.pc | 2 - .../pc/qla2xxx-v8.00.00b1-2.5.73.pc | 42 + .../pc/tcp_zero_copy_2.4.20_chaos.pc | 5 + lustre/kernel_patches/pc/tg3_netconsole.pc | 1 - ...atch-2.4.20-4.pc => uml-patch-2.4.20-6.pc} | 78 +- lustre/kernel_patches/pc/uml_compile_fixes.pc | 1 - ...-18.pc => vfs_intent-2.4.18-18-chaos65.pc} | 8 +- .../kernel_patches/pc/vfs_intent-2.4.20-hp.pc | 14 + .../pc/vfs_intent_2.4.20_chaos.pc | 14 + ...re-2.5.63.pc => vfs_intent_2.5.72_rev1.pc} | 14 +- .../pc/vfs_intent_2.6.0-test1.pc | 14 + .../pc/vfs_mntcwd_2.5.72_rev1.pc | 0 .../pc/vfs_nointent_2.5.69_rev1.pc | 4 + .../pc/vfs_races_2.5.72_rev1.pc | 3 + .../series/{chaos => chaos-2.4.18} | 5 +- lustre/kernel_patches/series/chaos-2.4.20 | 24 + lustre/kernel_patches/series/kgdb-2.5.73 | 19 + lustre/kernel_patches/series/kgdb_2.6.0_test1 | 15 + lustre/kernel_patches/series/rh-2.4.18-18 | 24 - lustre/kernel_patches/series/vanilla-2.5 | 2 - ...pile_fixes.txt => ext3-map_inode_page.txt} | 0 .../txt/ext3-map_inode_page_2.4.18.txt | 3 + lustre/ldlm/Makefile.mk | 10 + lustre/llite/llite_lib.c | 951 + lustre/lov/lov_internal.h | 26 + lustre/mdc/Makefile.mk | 9 + lustre/mds/commit_confd.c | 76 + lustre/obdclass/obdo.c | 343 + lustre/obdclass/recov_log.c | 470 + lustre/obdfilter/filter_internal.h | 152 + lustre/obdfilter/filter_io.c | 806 + lustre/obdfilter/filter_log.c | 380 + lustre/obdfilter/filter_san.c | 124 + lustre/ost/Makefile.mk | 9 + lustre/portals/tests/Makefile.mk | 9 + lustre/portals/utils/Makefile.mk | 6 + lustre/ptlrpc/Makefile.mk | 11 + lustre/ptlrpc/recov_thread.c | 358 + lustre/tests/client-echo.cfg | 3 - lustre/tests/client-mount.cfg | 6 - lustre/tests/client-mount2.cfg | 10 - lustre/tests/common.sh | 713 - lustre/tests/elan-client.cfg | 5 - lustre/tests/elan-server.cfg | 5 - lustre/tests/ext2_10000.gz | Bin 10228 -> 0 bytes lustre/tests/ext2_25000.gz | Bin 25136 -> 0 bytes lustre/tests/ext3_10000.gz | Bin 12172 -> 0 bytes lustre/tests/fs.sh | 27 - lustre/tests/intent-test.sh | 122 - lustre/tests/intent-test2.sh | 70 - lustre/tests/ldlm.cfg | 3 - lustre/tests/llcleanup.sh | 19 - lustre/tests/lldlm.sh | 40 - lustre/tests/llext3.sh | 10 - lustre/tests/llmodules.sh | 41 - lustre/tests/llmount-client.sh | 9 - lustre/tests/llmount-server.sh | 9 - lustre/tests/llrext3.sh | 10 - lustre/tests/llrsetup.sh | 15 - lustre/tests/llsetup.sh | 15 - lustre/tests/llsimple.sh | 11 - lustre/tests/lustre.cfg | 49 - lustre/tests/mdcreq.sh | 37 - lustre/tests/mdcreqcleanup.sh | 34 - lustre/tests/mds.cfg | 7 - lustre/tests/modules.cfg | 3 - lustre/tests/net-client.cfg | 6 - lustre/tests/net-local.cfg | 6 - lustre/tests/net-server.cfg | 6 - lustre/tests/obddisk.cfg | 6 - lustre/tests/obdecho.cfg | 4 - lustre/tests/obdfilter.cfg | 7 - lustre/tests/ostreq.sh | 37 - lustre/tests/replay-single.sh | 81 + lustre/tests/runfailure-client-mds-recover.sh | 103 - lustre/tests/small_write.c | 134 + lustre/tests/snaprun.sh | 36 - lustre/tests/trivial.sh | 11 - 155 files changed, 272701 insertions(+), 7787 deletions(-) create mode 100644 lnet/tests/Makefile.mk create mode 100644 lnet/utils/Makefile.mk create mode 100644 lustre/include/linux/lustre_commit_confd.h create mode 100644 lustre/include/linux/lustre_log.h create mode 100644 lustre/include/linux/lustre_mgmt.h delete mode 100644 lustre/include/linux/obd_filter.h create mode 100644 lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73 create mode 100644 lustre/kernel_patches/patches/2.6.0-test1-mm2.patch create mode 100644 lustre/kernel_patches/patches/dump_netdev.patch delete mode 100644 lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch delete mode 100644 lustre/kernel_patches/patches/ext3-2.5-noread.patch delete mode 100644 lustre/kernel_patches/patches/ext3-2.5.63.patch create mode 100644 lustre/kernel_patches/patches/ext3-error-export.patch create mode 100644 lustre/kernel_patches/patches/ext3-map_inode_page.patch create mode 100644 lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch create mode 100644 lustre/kernel_patches/patches/ext3-noread-inode.patch rename lustre/kernel_patches/patches/{extN-san.patch => ext3-san-jdike-2.5.73.patch} (78%) delete mode 100644 lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch create mode 100644 lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch delete mode 100644 lustre/kernel_patches/patches/extN-delete_thread.patch delete mode 100644 lustre/kernel_patches/patches/extN-iget-debug.patch create mode 100644 lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch create mode 100644 lustre/kernel_patches/patches/inode-protection-from-pdflush.patch create mode 100644 lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch create mode 100644 lustre/kernel_patches/patches/iopen-2.5.73.patch delete mode 100644 lustre/kernel_patches/patches/jbd-transno-cb.patch create mode 100644 lustre/kernel_patches/patches/kexec-2.5.73-full.patch create mode 100644 lustre/kernel_patches/patches/kexec-2.6.0-full.patch create mode 100644 lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch create mode 100644 lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch create mode 100644 lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch create mode 100644 lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch create mode 100644 lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch create mode 100644 lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch delete mode 100644 lustre/kernel_patches/patches/lustre-2.5.63.patch create mode 100644 lustre/kernel_patches/patches/lustre_build.patch delete mode 100644 lustre/kernel_patches/patches/netconsole_sysrq.patch create mode 100644 lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch create mode 100644 lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch delete mode 100644 lustre/kernel_patches/patches/tg3_netconsole.patch rename lustre/kernel_patches/patches/{uml-patch-2.4.20-4.patch => uml-patch-2.4.20-6.patch} (93%) delete mode 100644 lustre/kernel_patches/patches/uml_compile_fixes.patch rename lustre/kernel_patches/patches/{vfs_intent-2.4.18-18.patch => vfs_intent-2.4.18-18-chaos65.patch} (64%) create mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch create mode 100644 lustre/kernel_patches/patches/vfs_intent_2.4.20_chaos.patch create mode 100644 lustre/kernel_patches/patches/vfs_intent_2.5.72_rev1.patch create mode 100644 lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch create mode 100644 lustre/kernel_patches/patches/vfs_mntcwd_2.5.72_rev1.patch create mode 100644 lustre/kernel_patches/patches/vfs_nointent_2.5.69_rev1.patch create mode 100644 lustre/kernel_patches/patches/vfs_races_2.5.72_rev1.patch create mode 100644 lustre/kernel_patches/pc/2.6.0-test1-mm2.pc create mode 100644 lustre/kernel_patches/pc/dump_netdev.pc delete mode 100644 lustre/kernel_patches/pc/ext3-2.4.18-fixes.pc delete mode 100644 lustre/kernel_patches/pc/ext3-2.5.63.pc create mode 100644 lustre/kernel_patches/pc/ext3-error-export.pc create mode 100644 lustre/kernel_patches/pc/ext3-map_inode_page.pc create mode 100644 lustre/kernel_patches/pc/ext3-map_inode_page_2.4.18.pc rename lustre/kernel_patches/pc/{ext3-2.5-noread.pc => ext3-noread-inode.pc} (100%) rename lustre/kernel_patches/pc/{extN-san.pc => ext3-san-jdike-2.5.73.pc} (100%) delete mode 100644 lustre/kernel_patches/pc/ext3-truncate_blocks-chaos.patch.pc rename lustre/kernel_patches/pc/{extN-delete_thread.pc => ext3_delete_thread_2.4.20_chaos.pc} (68%) delete mode 100644 lustre/kernel_patches/pc/extN-iget-debug.pc create mode 100644 lustre/kernel_patches/pc/gpl_header-chaos-2.4.20.pc create mode 100644 lustre/kernel_patches/pc/inode-protection-from-pdflush.pc create mode 100644 lustre/kernel_patches/pc/inode-unhash_2.5.75.pc create mode 100644 lustre/kernel_patches/pc/invalidate_show_2.4.20_chaos.pc create mode 100644 lustre/kernel_patches/pc/iopen-2.5.73.pc delete mode 100644 lustre/kernel_patches/pc/jbd-transno-cb.pc create mode 100644 lustre/kernel_patches/pc/kexec-2.5.73-full.pc create mode 100644 lustre/kernel_patches/pc/kexec-2.6.0-full.pc create mode 100644 lustre/kernel_patches/pc/kgdb-ga-2.5.73.pc create mode 100644 lustre/kernel_patches/pc/kgdb-ga-docco-fixes-2.5.73.pc create mode 100644 lustre/kernel_patches/pc/kgdb-use-ggdb-2.5.73.pc create mode 100644 lustre/kernel_patches/pc/lkcd-cvs-2.5.69.pc create mode 100644 lustre/kernel_patches/pc/lkcd-kernel-changes-2.5.73.pc create mode 100644 lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc create mode 100644 lustre/kernel_patches/pc/lustre_build.pc delete mode 100644 lustre/kernel_patches/pc/netconsole_sysrq.pc create mode 100644 lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc create mode 100644 lustre/kernel_patches/pc/tcp_zero_copy_2.4.20_chaos.pc delete mode 100644 lustre/kernel_patches/pc/tg3_netconsole.pc rename lustre/kernel_patches/pc/{uml-patch-2.4.20-4.pc => uml-patch-2.4.20-6.pc} (99%) delete mode 100644 lustre/kernel_patches/pc/uml_compile_fixes.pc rename lustre/kernel_patches/pc/{vfs_intent-2.4.18-18.pc => vfs_intent-2.4.18-18-chaos65.pc} (74%) create mode 100644 lustre/kernel_patches/pc/vfs_intent-2.4.20-hp.pc create mode 100644 lustre/kernel_patches/pc/vfs_intent_2.4.20_chaos.pc rename lustre/kernel_patches/pc/{lustre-2.5.63.pc => vfs_intent_2.5.72_rev1.pc} (63%) create mode 100644 lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc create mode 100644 lustre/kernel_patches/pc/vfs_mntcwd_2.5.72_rev1.pc create mode 100644 lustre/kernel_patches/pc/vfs_nointent_2.5.69_rev1.pc create mode 100644 lustre/kernel_patches/pc/vfs_races_2.5.72_rev1.pc rename lustre/kernel_patches/series/{chaos => chaos-2.4.18} (82%) create mode 100644 lustre/kernel_patches/series/chaos-2.4.20 create mode 100644 lustre/kernel_patches/series/kgdb-2.5.73 create mode 100644 lustre/kernel_patches/series/kgdb_2.6.0_test1 delete mode 100644 lustre/kernel_patches/series/rh-2.4.18-18 delete mode 100644 lustre/kernel_patches/series/vanilla-2.5 rename lustre/kernel_patches/txt/{uml_compile_fixes.txt => ext3-map_inode_page.txt} (100%) create mode 100644 lustre/kernel_patches/txt/ext3-map_inode_page_2.4.18.txt create mode 100644 lustre/ldlm/Makefile.mk create mode 100644 lustre/llite/llite_lib.c create mode 100644 lustre/lov/lov_internal.h create mode 100644 lustre/mdc/Makefile.mk create mode 100644 lustre/mds/commit_confd.c create mode 100644 lustre/obdclass/obdo.c create mode 100644 lustre/obdclass/recov_log.c create mode 100644 lustre/obdfilter/filter_internal.h create mode 100644 lustre/obdfilter/filter_io.c create mode 100644 lustre/obdfilter/filter_log.c create mode 100644 lustre/obdfilter/filter_san.c create mode 100644 lustre/ost/Makefile.mk create mode 100644 lustre/portals/tests/Makefile.mk create mode 100644 lustre/portals/utils/Makefile.mk create mode 100644 lustre/ptlrpc/Makefile.mk create mode 100644 lustre/ptlrpc/recov_thread.c delete mode 100644 lustre/tests/client-echo.cfg delete mode 100644 lustre/tests/client-mount.cfg delete mode 100644 lustre/tests/client-mount2.cfg delete mode 100644 lustre/tests/common.sh delete mode 100644 lustre/tests/elan-client.cfg delete mode 100644 lustre/tests/elan-server.cfg delete mode 100644 lustre/tests/ext2_10000.gz delete mode 100644 lustre/tests/ext2_25000.gz delete mode 100644 lustre/tests/ext3_10000.gz delete mode 100644 lustre/tests/fs.sh delete mode 100755 lustre/tests/intent-test.sh delete mode 100644 lustre/tests/intent-test2.sh delete mode 100644 lustre/tests/ldlm.cfg delete mode 100755 lustre/tests/llcleanup.sh delete mode 100755 lustre/tests/lldlm.sh delete mode 100755 lustre/tests/llext3.sh delete mode 100644 lustre/tests/llmodules.sh delete mode 100644 lustre/tests/llmount-client.sh delete mode 100644 lustre/tests/llmount-server.sh delete mode 100755 lustre/tests/llrext3.sh delete mode 100644 lustre/tests/llrsetup.sh delete mode 100644 lustre/tests/llsetup.sh delete mode 100755 lustre/tests/llsimple.sh delete mode 100644 lustre/tests/lustre.cfg delete mode 100644 lustre/tests/mdcreq.sh delete mode 100755 lustre/tests/mdcreqcleanup.sh delete mode 100644 lustre/tests/mds.cfg delete mode 100755 lustre/tests/modules.cfg delete mode 100644 lustre/tests/net-client.cfg delete mode 100644 lustre/tests/net-local.cfg delete mode 100644 lustre/tests/net-server.cfg delete mode 100644 lustre/tests/obddisk.cfg delete mode 100644 lustre/tests/obdecho.cfg delete mode 100644 lustre/tests/obdfilter.cfg delete mode 100644 lustre/tests/ostreq.sh create mode 100755 lustre/tests/replay-single.sh delete mode 100755 lustre/tests/runfailure-client-mds-recover.sh create mode 100644 lustre/tests/small_write.c delete mode 100755 lustre/tests/snaprun.sh delete mode 100755 lustre/tests/trivial.sh diff --git a/lnet/tests/Makefile.mk b/lnet/tests/Makefile.mk new file mode 100644 index 0000000000..751c0a002a --- /dev/null +++ b/lnet/tests/Makefile.mk @@ -0,0 +1,9 @@ +# Copyright (C) 2001 Cluster File Systems, Inc. +# +# This code is issued under the GNU General Public License. +# See the file COPYING in this distribution + +include $(src)/../Kernelenv + +obj-y += ping_cli.o +obj-y += ping_srv.o diff --git a/lnet/utils/Makefile.mk b/lnet/utils/Makefile.mk new file mode 100644 index 0000000000..cbbe6d5e99 --- /dev/null +++ b/lnet/utils/Makefile.mk @@ -0,0 +1,6 @@ +include $(src)/../Kernelenv + +host-progs := acceptor ptlctl +always := $(host-progs) + +ptlctl-objs := ptlctl.o $(PTLCTLOBJS) diff --git a/lustre/include/linux/lustre_commit_confd.h b/lustre/include/linux/lustre_commit_confd.h new file mode 100644 index 0000000000..980e6ced80 --- /dev/null +++ b/lustre/include/linux/lustre_commit_confd.h @@ -0,0 +1,73 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001 Cluster File Systems, Inc. <info@clusterfs.com> + * + * This file is part of Lustre, http://www.lustre.org. + * + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * Lustre is distributed in the hope that it will be 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 Lustre; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Structures relating to the log commit thread. + */ + +#ifndef _LUSTRE_COMMIT_CONFD_H +#define _LUSTRE_COMMIT_CONFD_H + +#include <linux/lustre_log.h> + +struct llog_commit_data { + struct list_head llcd_list; /* free or pending struct list */ + struct obd_import *llcd_import; + struct llog_commit_master *llcd_lcm; + int llcd_tries; /* number of tries to send */ + int llcd_cookiebytes; + struct llog_cookie llcd_cookies[0]; +}; + +struct llog_commit_master { + struct list_head lcm_thread_busy; /* list of busy daemons */ + struct list_head lcm_thread_idle; /* list of idle daemons */ + spinlock_t lcm_thread_lock; /* protects thread_list */ + atomic_t lcm_thread_numidle;/* number of idle threads */ + atomic_t lcm_thread_total; /* total number of threads */ + int lcm_thread_max; /* <= num_osts normally */ + + int lcm_flags; + wait_queue_head_t lcm_waitq; + + struct list_head lcm_llcd_pending; /* llog_commit_data to send */ + struct list_head lcm_llcd_resend; /* try to resend this data */ + struct list_head lcm_llcd_free; /* free llog_commit_data */ + spinlock_t lcm_llcd_lock; /* protects llcd_free */ + atomic_t lcm_llcd_numfree; /* items on llcd_free */ + int lcm_llcd_minfree; /* min free on llcd_free */ + int lcm_llcd_maxfree; /* max free on llcd_free */ +}; + +#define LLOG_LCM_FL_EXIT 0x01 +#define LLOG_LCM_FL_EXIT_FORCE 0x02 + +/* the thread data that collects local commits and makes rpc's */ +struct llog_commit_daemon { + struct list_head lcd_lcm_list; /* list of daemon threads */ + struct list_head lcd_llcd_list; /* list of pending RPCs */ + struct llog_commit_master *lcd_lcm; /* pointer back to parent */ +}; + +/* ptlrpc/recov_thread.c */ +int llog_start_commit_thread(void); +struct llog_commit_data *llcd_grab(void); +void llcd_send(struct llog_commit_data *llcd); + +#endif /* _LUSTRE_COMMIT_CONFD_H */ diff --git a/lustre/include/linux/lustre_log.h b/lustre/include/linux/lustre_log.h new file mode 100644 index 0000000000..2f215839f9 --- /dev/null +++ b/lustre/include/linux/lustre_log.h @@ -0,0 +1,81 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001 Cluster File Systems, Inc. <info@clusterfs.com> + * + * This file is part of Lustre, http://www.lustre.org. + * + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * Lustre is distributed in the hope that it will be 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 Lustre; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Generic infrastructure for managing a collection of logs. + * + * These logs are used for: + * + * - orphan recovery: OST adds record on create + * - mtime/size consistency: the OST adds a record on first write + * - open/unlinked objects: OST adds a record on destroy + * + * - mds unlink log: the MDS adds an entry upon delete + * + * - raid1 replication log between OST's + * - MDS replication logs + */ + +#ifndef _LUSTRE_LOG_H +#define _LUSTRE_LOG_H + +#include <linux/lustre_idl.h> + +struct obd_trans_info; +struct obd_device; +struct lov_stripe_md; + +/* In-memory descriptor for a log object or log catalog */ +struct llog_handle { + struct list_head lgh_list; + struct llog_cookie lgh_cookie; + struct semaphore lgh_lock; + struct obd_device *lgh_obd; + void *lgh_hdr; + struct file *lgh_file; + struct obd_uuid *lgh_tgtuuid; + struct llog_handle *lgh_current; + struct llog_handle *(*lgh_log_create)(struct obd_device *obd); + struct llog_handle *(*lgh_log_open)(struct obd_device *obd, + struct llog_cookie *logcookie); + int (*lgh_log_close)(struct llog_handle *cathandle, + struct llog_handle *loghandle); + int lgh_index; +}; + +extern int llog_add_record(struct llog_handle *cathandle, + struct llog_trans_hdr *rec, + struct llog_cookie *logcookies); + +extern int llog_cancel_records(struct llog_handle *cathandle, int count, + struct llog_cookie *cookies); + +extern struct llog_handle *llog_alloc_handle(void); +extern void llog_free_handle(struct llog_handle *handle); +extern int llog_init_catalog(struct llog_handle *cathandle, + struct obd_uuid *tgtuuid); +extern int llog_delete_log(struct llog_handle *cathandle, + struct llog_handle *loghandle); +extern int llog_close_log(struct llog_handle *cathandle, + struct llog_handle *loghandle); +extern struct llog_handle *llog_new_log(struct llog_handle *cathandle, + struct obd_uuid *tgtuuid); + +#endif + diff --git a/lustre/include/linux/lustre_mgmt.h b/lustre/include/linux/lustre_mgmt.h new file mode 100644 index 0000000000..91a8113380 --- /dev/null +++ b/lustre/include/linux/lustre_mgmt.h @@ -0,0 +1,34 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001 Cluster File Systems, Inc. + * + * This code is issued under the GNU General Public License. + * See the file COPYING in this distribution + */ + +#ifndef LUSTRE_MGMT_H +#define LUSTRE_MGMT_H + +#define LUSTRE_MGMTCLI_NAME "mgmt_cli" + +/* For the convenience and type-safety of inter_module_getters. */ + +struct obd_device; +struct obd_uuid; + +/* + * The caller is responsible for ensuring that relevant_uuid -- if non-NULL -- + * points to valid memory until deregister is called. If relevant_uuid is NULL, + * all management events will be propagated to the registrant. Notice that + * deregister doesn't take a relevant_uuid-matching parameter; I should probably + * fix that at some point. + */ +typedef int (*mgmtcli_register_for_events_t)(struct obd_device *mgmt_obd, + struct obd_device *notify_obd, + struct obd_uuid *relevant_uuid); + +typedef int (*mgmtcli_deregister_for_events_t)(struct obd_device *mgmt_obd, + struct obd_device *notify_obd); + +#endif /* LUSTRE_MGMT_H */ diff --git a/lustre/include/linux/obd_filter.h b/lustre/include/linux/obd_filter.h deleted file mode 100644 index 3d8188a6fe..0000000000 --- a/lustre/include/linux/obd_filter.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2002 Cluster File Systems, Inc. - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be 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 Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _OBD_FILTER_H -#define _OBD_FILTER_H - -#ifdef __KERNEL__ -#include <linux/spinlock.h> -#endif -#include <linux/lustre_handles.h> - -#ifndef OBD_FILTER_DEVICENAME -#define OBD_FILTER_DEVICENAME "obdfilter" -#endif - -#define FILTER_LR_SERVER_SIZE 512 - -#define FILTER_LR_CLIENT_START 8192 -#define FILTER_LR_CLIENT_SIZE 128 - -#define FILTER_SUBDIR_COUNT 32 /* set to zero for no subdirs */ - -#define FILTER_MOUNT_RECOV 2 -#define FILTER_RECOVERY_TIMEOUT (obd_timeout * 5 * HZ / 2) /* *waves hands* */ - -/* Data stored per server at the head of the last_rcvd file. In le32 order. */ -struct filter_server_data { - __u8 fsd_uuid[37]; /* server UUID */ - __u8 fsd_uuid_padding[3]; /* unused */ - __u64 fsd_last_objid; /* last created object ID */ - __u64 fsd_last_rcvd; /* last completed transaction ID */ - __u64 fsd_mount_count; /* FILTER incarnation number */ - __u32 fsd_feature_compat; /* compatible feature flags */ - __u32 fsd_feature_rocompat;/* read-only compatible feature flags */ - __u32 fsd_feature_incompat;/* incompatible feature flags */ - __u32 fsd_server_size; /* size of server data area */ - __u32 fsd_client_start; /* start of per-client data area */ - __u16 fsd_client_size; /* size of per-client data area */ - __u16 fsd_subdir_count; /* number of subdirectories for objects */ - __u8 fsd_padding[FILTER_LR_SERVER_SIZE - 88]; -}; - -/* Data stored per client in the last_rcvd file. In le32 order. */ -struct filter_client_data { - __u8 fcd_uuid[37]; /* client UUID */ - __u8 fcd_uuid_padding[3]; /* unused */ - __u64 fcd_last_rcvd; /* last completed transaction ID */ - __u64 fcd_mount_count; /* FILTER incarnation number */ - __u64 fcd_last_xid; /* client RPC xid for the last transaction */ - __u8 fcd_padding[FILTER_LR_CLIENT_SIZE - 64]; -}; - -#ifndef OBD_FILTER_SAN_DEVICENAME -#define OBD_FILTER_SAN_DEVICENAME "sanobdfilter" -#endif - -/* In-memory access to client data from OST struct */ -struct filter_export_data { - struct list_head fed_open_head; /* files to close on disconnect */ - spinlock_t fed_lock; /* protects fed_open_head */ - struct filter_client_data *fed_fcd; - loff_t fed_lr_off; - int fed_lr_idx; -}; - -/* file data for open files on OST */ -struct filter_file_data { - struct portals_handle ffd_handle; - atomic_t ffd_refcount; - struct list_head ffd_export_list; /* export open list - fed_lock */ - struct file *ffd_file; /* file handle */ -}; - -struct filter_dentry_data { - obd_id fdd_objid; - __u32 fdd_magic; - atomic_t fdd_open_count; - int fdd_flags; -}; - -#define FILTER_DENTRY_MAGIC 0x9efba101 -#define FILTER_FLAG_DESTROY 0x0001 /* destroy dentry on last file close */ - - -#endif diff --git a/lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73 b/lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73 new file mode 100644 index 0000000000..4033739d41 --- /dev/null +++ b/lustre/kernel_patches/kernel_configs/kgdb-vmware-2.5.73 @@ -0,0 +1,908 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_LOG_BUF_SHIFT=15 +# CONFIG_EMBEDDED is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +CONFIG_MPENTIUMIII=y +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MELAN is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=5 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_SMP=y +CONFIG_NR_CPUS=16 +# CONFIG_PREEMPT is not set +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +# CONFIG_X86_MCE_NONFATAL is not set +CONFIG_X86_MCE_P4THERMAL=y +# CONFIG_TOSHIBA is not set +# CONFIG_I8K is not set +# CONFIG_MICROCODE is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set +CONFIG_EDD=y +CONFIG_NOHIGHMEM=y +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +CONFIG_HAVE_DEC_LOCK=y + +# +# Power management options (ACPI, APM) +# +# CONFIG_PM is not set + +# +# ACPI Support +# +# CONFIG_ACPI is not set + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +# CONFIG_PCI_LEGACY_PROC is not set +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +# CONFIG_SCx200 is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=y +# CONFIG_YENTA is not set +# CONFIG_I82092 is not set +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=y +CONFIG_BINFMT_MISC=y + +# +# Generic Driver Options +# +# CONFIG_FW_LOADER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# +CONFIG_PNP=y +CONFIG_PNP_NAMES=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +# CONFIG_IDEDISK_STROKE is not set +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_IDEPNP is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_BLK_DEV_GENERIC=y +CONFIG_IDEPCI_SHARE_IRQ=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDE_TCQ is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_PCI_WIP is not set +CONFIG_BLK_DEV_ADMA=y +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_SC1200 is not set +CONFIG_BLK_DEV_PIIX=y +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +CONFIG_BLK_DEV_RZ1000=y +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_BLK_DEV_IDE_MODES=y + +# +# SCSI device support +# +CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_REPORT_LUNS=y +CONFIG_SCSI_CONSTANTS=y +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_IN2000 is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_MEGARAID is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_NCR53C406A is not set +CONFIG_SCSI_SYM53C8XX_2=y +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_SEAGATE is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_ULTRASTOR is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_AHA152X is not set +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_NINJA_SCSI is not set +# CONFIG_PCMCIA_QLOGIC is not set + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK_DEV is not set +# CONFIG_NETFILTER is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_IPV6 is not set +# CONFIG_XFRM_USER is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_LLC is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=m +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_ETHERTAP is not set +# CONFIG_NET_SB1000 is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_MII is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +CONFIG_NET_PCI=y +CONFIG_PCNET32=y +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set +# CONFIG_B44 is not set +# CONFIG_CS89x0 is not set +# CONFIG_DGRS is not set +CONFIG_EEPRO100=y +# CONFIG_EEPRO100_PIO is not set +# CONFIG_E100 is not set +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_IXGB is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices (depends on LLC=y) +# +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_FMVJ18X is not set +CONFIG_PCMCIA_PCNET=y +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_PCMCIA_AXNET is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN_BOOL is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +# CONFIG_SERIO is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# I2C Hardware Sensors Mainboard support +# + +# +# I2C Hardware Sensors Chip support +# +# CONFIG_I2C_SENSOR is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_QIC02_TAPE is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +CONFIG_AGP=y +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_AMD is not set +# CONFIG_AGP_AMD_8151 is not set +# CONFIG_AGP_INTEL is not set +# CONFIG_AGP_NVIDIA is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_SWORKS is not set +# CONFIG_AGP_VIA is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +# CONFIG_MWAVE is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_HANGCHECK_TIMER is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +CONFIG_DEVPTS_FS=y +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +# CONFIG_EXPORTFS is not set +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_GSS is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +CONFIG_LUSTRE_FS=y +# CONFIG_INTERMEZZO_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Graphics support +# +# CONFIG_FB is not set +CONFIG_VIDEO_SELECT=y + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set +# CONFIG_USB_GADGET is not set + +# +# Bluetooth support +# +# CONFIG_BT is not set + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y + +# +# Kernel hacking +# +# CONFIG_CRASH_DUMP is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_IOVIRT is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_KALLSYMS=y +CONFIG_DEBUG_SPINLOCK_SLEEP=y +CONFIG_KGDB=y +# CONFIG_KGDB_9600BAUD is not set +# CONFIG_KGDB_19200BAUD is not set +# CONFIG_KGDB_38400BAUD is not set +# CONFIG_KGDB_57600BAUD is not set +CONFIG_KGDB_115200BAUD=y +CONFIG_KGDB_PORT=0x3f8 +CONFIG_KGDB_IRQ=4 +CONFIG_DEBUG_INFO=y +# CONFIG_KGDB_MORE is not set +CONFIG_NO_KGDB_CPUS=16 +# CONFIG_KGDB_TS is not set +# CONFIG_STACK_OVERFLOW_TEST is not set +CONFIG_KGDB_CONSOLE=y +CONFIG_KGDB_SYSRQ=y +CONFIG_FRAME_POINTER=y +CONFIG_X86_EXTRA_IRQS=y +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC32 is not set +CONFIG_X86_SMP=y +CONFIG_X86_HT=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y 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 index 0000000000..9f476e05b6 --- /dev/null +++ b/lustre/kernel_patches/patches/2.6.0-test1-mm2.patch @@ -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, <ype); + 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(®s);\ ++ }\ ++ 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) ®s->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(®s); ++} ++#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(®s); ++ 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(®s); ++ 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(®s); ++ 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, ®s, 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, ®s); ++ 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, ®s); ++ if ((!usethread || usethread == current) && ++ hexToInt(&ptr, ®no) && ++ *ptr++ == '=' && (regno >= 0)) { ++ regno = ++ (regno >= NUMREGS ? _GS : regno); ++ hex2mem(ptr, (char *) &gdb_regs[regno], ++ 4, 0); ++ gdb_regs_to_regs(gdb_regs, ®s); ++ 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(®s); ++ } ++ 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,÷_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(¤t->thread.float_regs[0], ¤t->thread.fsr, + ¤t->thread.fpqueue[0], ¤t->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(¤t->thread.float_regs[0], ¤t->thread.fsr, + ¤t->thread.fpqueue[0], ¤t->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; /* $BFbB"L?Na(BRAM$B$O!V(Bread-mode$B!W$K$J$j$^$9(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) + + /* 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); + } + + +--- 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 (); +-} +- +- +-/* 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); + + 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 */ ++} ++ ++/* 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 ++} ++ ++ ++/* 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; ++} ++ ++/* 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); ++} ++ ++ ++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; +-} +- +-/* 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); +-} +- +- +-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)) ++ ++ ++/* 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; ++} ++ ++ ++/* 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); ++} ++ ++ ++/* 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 (); ++} ++ ++ ++/* 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(¤t->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, ¶ms); +- else +- r = next_target(spec, spec->next, begin, end, +- &spec, ¶ms); +- +- 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, ¶m->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, ¶m); +- 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, ¶ms); ++ else ++ r = next_target(spec, spec->next, begin, end, ++ &spec, ¶ms); ++ ++ 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, ¶m->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, ¶m); ++ 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, ¶m); ++ 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, ®ion, 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(¤t->blocked, sigmask(SIGHUP)); ++ } else { ++ siginitsetinv(¤t->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(<)); ++} ++ ++#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 +- +- +-/* 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)) +- +- +-/* 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); +-} +- +- +-/* 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 */ +- +-/* 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); +-} +- +-/* 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, +-}; +- +-/* 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 */ ++ ++ ++/* 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); ++} ++ ++ ++/* 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 */ ++ ++/* 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; ++} ++ ++ ++/* 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, ++}; ++ ++/* 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, ®ion); + } + +-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 = ∥ ++ 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, ¤tpar); +- +- 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 = ¤tpar; ++ 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 = ¤tpar; +- 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 = ¤tpar; ++ 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 = ¤tpar; ++ 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", ¤tpar)) { +- 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, ®s, ®s); +- +- 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, ®s, ®s); +- +- 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(¤t->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(¤t->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__ ++ ++ ++/* 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; ++} ++ ++ ++/* 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__ ++ ++ ++/* 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)) ++ ++ ++/* 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, ¶m); + #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, ¶m); + +@@ -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(¤t->fs->count) > 1 || ++ atomic_read(¤t->files->count) > 1 || ++ atomic_read(¤t->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(¤t->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/dump_netdev.patch b/lustre/kernel_patches/patches/dump_netdev.patch new file mode 100644 index 0000000000..cd8ec533b7 --- /dev/null +++ b/lustre/kernel_patches/patches/dump_netdev.patch @@ -0,0 +1,340 @@ + drivers/net/3c59x.c | 27 +++++++++++++++++++++++++++ + drivers/net/e100/e100_main.c | 19 +++++++++++++++++++ + drivers/net/e1000/e1000_main.c | 13 +++++++++++++ + drivers/net/eepro100.c | 21 +++++++++++++++++++++ + drivers/net/smc-ultra.c | 11 +++++++++++ + drivers/net/tlan.c | 14 +++++++++++++- + drivers/net/tulip/tulip_core.c | 22 ++++++++++++++++++++++ + include/linux/netdevice.h | 3 +++ + net/core/dev.c | 18 ++++++++++++++++-- + 9 files changed, 145 insertions(+), 3 deletions(-) + +--- linux-2.6.0-test1/drivers/net/3c59x.c~dump_netdev 2003-07-22 01:14:04.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/3c59x.c 2003-07-22 01:15:10.000000000 -0600 +@@ -900,6 +900,7 @@ static void set_rx_mode(struct net_devic + static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); + static void vortex_tx_timeout(struct net_device *dev); + static void acpi_set_WOL(struct net_device *dev); ++static void vorboom_poll(struct net_device *dev); + + /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */ + /* Option count limit only -- unlimited interfaces are supported. */ +@@ -1448,6 +1449,9 @@ 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; ++#ifdef HAVE_POLL_CONTROLLER ++ dev->poll_controller = &vorboom_poll; ++#endif + if (pdev) { + vp->pm_state_valid = 1; + pci_save_state(VORTEX_PCI(vp), vp->power_state); +@@ -2438,6 +2442,29 @@ handler_exit: + return IRQ_HANDLED; + } + ++#ifdef HAVE_POLL_CONTROLLER ++ ++/* ++ * Polling 'interrupt' - used by things like netconsole to send skbs ++ * without having to re-enable interrupts. It's not called while ++ * the interrupt routine is executing. ++ */ ++ ++static void vorboom_poll (struct net_device *dev) ++{ ++ struct vortex_private *vp = (struct vortex_private *)dev->priv; ++ ++ disable_irq(dev->irq); ++ if (vp->full_bus_master_tx) ++ boomerang_interrupt(dev->irq, dev, 0); ++ else ++ vortex_interrupt(dev->irq, dev, 0); ++ enable_irq(dev->irq); ++} ++ ++#endif ++ ++ + static int vortex_rx(struct net_device *dev) + { + struct vortex_private *vp = (struct vortex_private *)dev->priv; +--- linux-2.6.0-test1/drivers/net/e100/e100_main.c~dump_netdev 2003-07-13 21:34:02.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/e100/e100_main.c 2003-07-22 01:14:38.000000000 -0600 +@@ -551,6 +551,22 @@ e100_trigger_SWI(struct e100_private *bd + readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */ + } + ++#ifdef HAVE_POLL_CONTROLLER ++ ++/* ++ * Polling 'interrupt' - used by things like netconsole to send skbs ++ * without having to re-enable interrupts. It's not called while ++ * the interrupt routine is executing. ++ */ ++static void ++e100_poll(struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ e100intr(dev->irq, dev, NULL); ++ enable_irq(dev->irq); ++} ++#endif ++ + static int __devinit + e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent) + { +@@ -569,6 +585,9 @@ e100_found1(struct pci_dev *pcid, const + + SET_MODULE_OWNER(dev); + ++#ifdef HAVE_POLL_CONTROLLER ++ dev->poll_controller = &e100_poll; ++#endif + if (first_time) { + first_time = false; + printk(KERN_NOTICE "%s - version %s\n", +--- linux-2.6.0-test1/drivers/net/e1000/e1000_main.c~dump_netdev 2003-07-13 21:32:43.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/e1000/e1000_main.c 2003-07-22 01:14:38.000000000 -0600 +@@ -138,6 +138,7 @@ static void e1000_leave_82542_rst(struct + static inline void e1000_rx_checksum(struct e1000_adapter *adapter, + struct e1000_rx_desc *rx_desc, + struct sk_buff *skb); ++static void e1000_Poll(struct net_device *dev); + static void e1000_tx_timeout(struct net_device *dev); + static void e1000_tx_timeout_task(struct net_device *dev); + static void e1000_smartspeed(struct e1000_adapter *adapter); +@@ -402,6 +403,9 @@ e1000_probe(struct pci_dev *pdev, + + adapter->bd_number = cards_found; + ++#ifdef HAVE_POLL_CONTROLLER ++ netdev->poll_controller = &e1000_Poll; ++#endif + /* setup the private structure */ + + if(e1000_sw_init(adapter)) +@@ -1700,6 +1704,15 @@ e1000_xmit_frame(struct sk_buff *skb, st + return 0; + } + ++#ifdef HAVE_POLL_CONTROLLER ++static void e1000_Poll(struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ e1000_intr(dev->irq, dev, NULL); ++ enable_irq(dev->irq); ++} ++#endif ++ + /** + * e1000_tx_timeout - Respond to a Tx Hang + * @netdev: network interface device structure +--- linux-2.6.0-test1/drivers/net/eepro100.c~dump_netdev 2003-07-13 21:35:52.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/eepro100.c 2003-07-22 01:14:38.000000000 -0600 +@@ -543,6 +543,7 @@ static void speedo_refill_rx_buffers(str + static int speedo_rx(struct net_device *dev); + static void speedo_tx_buffer_gc(struct net_device *dev); + static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs); ++static void poll_speedo (struct net_device *dev); + static int speedo_close(struct net_device *dev); + static struct net_device_stats *speedo_get_stats(struct net_device *dev); + static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +@@ -885,6 +886,9 @@ static int __devinit speedo_found1(struc + dev->get_stats = &speedo_get_stats; + dev->set_multicast_list = &set_rx_mode; + dev->do_ioctl = &speedo_ioctl; ++#ifdef HAVE_POLL_CONTROLLER ++ dev->poll_controller = &poll_speedo; ++#endif + + if (register_netdevice(dev)) + goto err_free_unlock; +@@ -1675,6 +1679,23 @@ static irqreturn_t speedo_interrupt(int + return IRQ_RETVAL(handled); + } + ++#ifdef HAVE_POLL_CONTROLLER ++ ++/* ++ * Polling 'interrupt' - used by things like netconsole to send skbs ++ * without having to re-enable interrupts. It's not called while ++ * the interrupt routine is executing. ++ */ ++ ++static void poll_speedo (struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ speedo_interrupt (dev->irq, dev, NULL); ++ enable_irq(dev->irq); ++} ++ ++#endif ++ + static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry) + { + struct speedo_private *sp = (struct speedo_private *)dev->priv; +--- linux-2.6.0-test1/drivers/net/smc-ultra.c~dump_netdev 2003-07-13 21:30:47.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/smc-ultra.c 2003-07-22 01:14:38.000000000 -0600 +@@ -122,6 +122,14 @@ MODULE_DEVICE_TABLE(isapnp, ultra_device + #define ULTRA_IO_EXTENT 32 + #define EN0_ERWCNT 0x08 /* Early receive warning count. */ + ++ ++static void ultra_poll(struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ ei_interrupt(dev->irq, dev, NULL); ++ enable_irq(dev->irq); ++} ++ + /* Probe for the Ultra. This looks like a 8013 with the station + address PROM at I/O ports <base>+8 to <base>+13, with a checksum + following. +@@ -134,6 +142,9 @@ int __init ultra_probe(struct net_device + + SET_MODULE_OWNER(dev); + ++#ifdef HAVE_POLL_CONTROLLER ++ dev->poll_controller = &ultra_poll; ++#endif + if (base_addr > 0x1ff) /* Check a single specified location. */ + return ultra_probe1(dev, base_addr); + else if (base_addr != 0) /* Don't probe at all. */ +--- linux-2.6.0-test1/drivers/net/tlan.c~dump_netdev 2003-07-13 21:30:42.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/tlan.c 2003-07-22 01:14:38.000000000 -0600 +@@ -345,6 +345,8 @@ static int TLan_EeSendByte( u16, u8, int + static void TLan_EeReceiveByte( u16, u8 *, int ); + static int TLan_EeReadByte( struct net_device *, u8, u8 * ); + ++static void TLan_Poll(struct net_device *); ++ + + static void + TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb) +@@ -890,6 +892,9 @@ static int TLan_Init( struct net_device + dev->get_stats = &TLan_GetStats; + dev->set_multicast_list = &TLan_SetMulticastList; + dev->do_ioctl = &TLan_ioctl; ++#ifdef HAVE_POLL_CONTROLLER ++ dev->poll_controller = &TLan_Poll; ++#endif + dev->tx_timeout = &TLan_tx_timeout; + dev->watchdog_timeo = TX_TIMEOUT; + +@@ -1173,7 +1178,14 @@ static irqreturn_t TLan_HandleInterrupt( + return IRQ_HANDLED; + } /* TLan_HandleInterrupts */ + +- ++#ifdef HAVE_POLL_CONTROLLER ++static void TLan_Poll(struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ TLan_HandleInterrupt(dev->irq, dev, NULL); ++ enable_irq(dev->irq); ++} ++#endif + + + /*************************************************************** +--- linux-2.6.0-test1/drivers/net/tulip/tulip_core.c~dump_netdev 2003-07-13 21:34:48.000000000 -0600 ++++ linux-2.6.0-test1-braam/drivers/net/tulip/tulip_core.c 2003-07-22 01:14:38.000000000 -0600 +@@ -245,6 +245,7 @@ static void tulip_down(struct net_device + static struct net_device_stats *tulip_get_stats(struct net_device *dev); + static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); + static void set_rx_mode(struct net_device *dev); ++static void poll_tulip(struct net_device *dev); + + + +@@ -1630,6 +1631,9 @@ static int __devinit tulip_init_one (str + dev->get_stats = tulip_get_stats; + dev->do_ioctl = private_ioctl; + dev->set_multicast_list = set_rx_mode; ++#ifdef HAVE_POLL_CONTROLLER ++ dev->poll_controller = &poll_tulip; ++#endif + + if (register_netdev(dev)) + goto err_out_free_ring; +@@ -1787,6 +1791,24 @@ static void __devexit tulip_remove_one ( + } + + ++#ifdef HAVE_POLL_CONTROLLER ++ ++/* ++ * Polling 'interrupt' - used by things like netconsole to send skbs ++ * without having to re-enable interrupts. It's not called while ++ * the interrupt routine is executing. ++ */ ++ ++static void poll_tulip (struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ tulip_interrupt (dev->irq, dev, NULL); ++ enable_irq(dev->irq); ++} ++ ++#endif ++ ++ + static struct pci_driver tulip_driver = { + .name = DRV_NAME, + .id_table = tulip_pci_tbl, +--- linux-2.6.0-test1/include/linux/netdevice.h~dump_netdev 2003-07-22 01:14:05.000000000 -0600 ++++ linux-2.6.0-test1-braam/include/linux/netdevice.h 2003-07-22 01:14:38.000000000 -0600 +@@ -446,6 +446,9 @@ struct net_device + unsigned char *haddr); + int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); + int (*accept_fastpath)(struct net_device *, struct dst_entry*); ++#define HAVE_POLL_CONTROLLER ++ void (*poll_controller)(struct net_device *dev); ++ int (*rx_hook)(struct sk_buff *skb); + + /* bridge stuff */ + struct net_bridge_port *br_port; +--- linux-2.6.0-test1/net/core/dev.c~dump_netdev 2003-07-22 01:14:05.000000000 -0600 ++++ linux-2.6.0-test1-braam/net/core/dev.c 2003-07-22 01:14:38.000000000 -0600 +@@ -1349,8 +1349,6 @@ int netif_rx(struct sk_buff *skb) + struct softnet_data *queue; + unsigned long flags; + +- if (!skb->stamp.tv_sec) +- do_gettimeofday(&skb->stamp); + + /* + * The code is rearranged so that the path is the most +@@ -1360,6 +1358,13 @@ int netif_rx(struct sk_buff *skb) + this_cpu = smp_processor_id(); + queue = &__get_cpu_var(softnet_data); + ++ if (skb->dev->rx_hook) ++ goto rx_hook; ++rx_hook_continue: ++ ++ if (!skb->stamp.tv_sec ) ++ do_gettimeofday(&skb->stamp); ++ + netdev_rx_stat[this_cpu].total++; + if (queue->input_pkt_queue.qlen <= netdev_max_backlog) { + if (queue->input_pkt_queue.qlen) { +@@ -1402,6 +1407,15 @@ drop: + + kfree_skb(skb); + return NET_RX_DROP; ++rx_hook: ++ { ++ int ret; ++ ++ ret = skb->dev->rx_hook(skb); ++ if (ret == NET_RX_DROP) ++ goto drop; ++ goto rx_hook_continue; ++ } + } + + /* Deliver skb to an old protocol, which is not threaded well + +_ diff --git a/lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch b/lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch deleted file mode 100644 index 56e841edd4..0000000000 --- a/lustre/kernel_patches/patches/ext3-2.4.18-fixes.patch +++ /dev/null @@ -1,353 +0,0 @@ -diff -ru lum-2.4.18-um30/fs/ext3/balloc.c uml-2.4.18-12.5/fs/ext3/balloc.c ---- lum-2.4.18-um30/fs/ext3/balloc.c Mon Feb 25 12:38:08 2002 -+++ uml-2.4.18-12.5/fs/ext3/balloc.c Thu Sep 19 13:40:11 2002 -@@ -276,7 +276,8 @@ - } - lock_super (sb); - es = sb->u.ext3_sb.s_es; -- if (block < le32_to_cpu(es->s_first_data_block) || -+ if (block < le32_to_cpu(es->s_first_data_block) || -+ block + count < block || - (block + count) > le32_to_cpu(es->s_blocks_count)) { - ext3_error (sb, "ext3_free_blocks", - "Freeing blocks not in datazone - " -@@ -309,17 +310,6 @@ - if (!gdp) - goto error_return; - -- if (in_range (le32_to_cpu(gdp->bg_block_bitmap), block, count) || -- in_range (le32_to_cpu(gdp->bg_inode_bitmap), block, count) || -- in_range (block, le32_to_cpu(gdp->bg_inode_table), -- sb->u.ext3_sb.s_itb_per_group) || -- in_range (block + count - 1, le32_to_cpu(gdp->bg_inode_table), -- sb->u.ext3_sb.s_itb_per_group)) -- ext3_error (sb, "ext3_free_blocks", -- "Freeing blocks in system zones - " -- "Block = %lu, count = %lu", -- block, count); -- - /* - * We are about to start releasing blocks in the bitmap, - * so we need undo access. -@@ -345,14 +335,24 @@ - if (err) - goto error_return; - -- for (i = 0; i < count; i++) { -+ for (i = 0; i < count; i++, block++) { -+ if (block == le32_to_cpu(gdp->bg_block_bitmap) || -+ block == le32_to_cpu(gdp->bg_inode_bitmap) || -+ in_range(block, le32_to_cpu(gdp->bg_inode_table), -+ sb->u.ext2_sb.s_itb_per_group)) { -+ ext3_error(sb, __FUNCTION__, -+ "Freeing block in system zone - block = %lu", -+ block); -+ continue; -+ } -+ - /* - * An HJ special. This is expensive... - */ - #ifdef CONFIG_JBD_DEBUG - { - struct buffer_head *debug_bh; -- debug_bh = sb_get_hash_table(sb, block + i); -+ debug_bh = sb_get_hash_table(sb, block); - if (debug_bh) { - BUFFER_TRACE(debug_bh, "Deleted!"); - if (!bh2jh(bitmap_bh)->b_committed_data) -@@ -365,9 +365,8 @@ - #endif - BUFFER_TRACE(bitmap_bh, "clear bit"); - if (!ext3_clear_bit (bit + i, bitmap_bh->b_data)) { -- ext3_error (sb, __FUNCTION__, -- "bit already cleared for block %lu", -- block + i); -+ ext3_error(sb, __FUNCTION__, -+ "bit already cleared for block %lu", block); - BUFFER_TRACE(bitmap_bh, "bit already cleared"); - } else { - dquot_freed_blocks++; -@@ -415,7 +417,6 @@ - if (!err) err = ret; - - if (overflow && !err) { -- block += count; - count = overflow; - goto do_more; - } -@@ -542,6 +543,7 @@ - int i, j, k, tmp, alloctmp; - int bitmap_nr; - int fatal = 0, err; -+ int performed_allocation = 0; - struct super_block * sb; - struct ext3_group_desc * gdp; - struct ext3_super_block * es; -@@ -575,6 +577,7 @@ - - ext3_debug ("goal=%lu.\n", goal); - -+repeat: - /* - * First, test whether the goal block is free. - */ -@@ -644,8 +647,7 @@ - } - - /* No space left on the device */ -- unlock_super (sb); -- return 0; -+ goto out; - - search_back: - /* -@@ -684,16 +686,28 @@ - if (tmp == le32_to_cpu(gdp->bg_block_bitmap) || - tmp == le32_to_cpu(gdp->bg_inode_bitmap) || - in_range (tmp, le32_to_cpu(gdp->bg_inode_table), -- sb->u.ext3_sb.s_itb_per_group)) -- ext3_error (sb, "ext3_new_block", -- "Allocating block in system zone - " -- "block = %u", tmp); -+ EXT3_SB(sb)->s_itb_per_group)) { -+ ext3_error(sb, __FUNCTION__, -+ "Allocating block in system zone - block = %u", tmp); -+ -+ /* Note: This will potentially use up one of the handle's -+ * buffer credits. Normally we have way too many credits, -+ * so that is OK. In _very_ rare cases it might not be OK. -+ * We will trigger an assertion if we run out of credits, -+ * and we will have to do a full fsck of the filesystem - -+ * better than randomly corrupting filesystem metadata. -+ */ -+ ext3_set_bit(j, bh->b_data); -+ goto repeat; -+ } -+ - - /* The superblock lock should guard against anybody else beating - * us to this point! */ - J_ASSERT_BH(bh, !ext3_test_bit(j, bh->b_data)); - BUFFER_TRACE(bh, "setting bitmap bit"); - ext3_set_bit(j, bh->b_data); -+ performed_allocation = 1; - - #ifdef CONFIG_JBD_DEBUG - { -@@ -815,6 +829,11 @@ - ext3_std_error(sb, fatal); - } - unlock_super (sb); -+ /* -+ * Undo the block allocation -+ */ -+ if (!performed_allocation) -+ DQUOT_FREE_BLOCK(inode, 1); - return 0; - - } -diff -ru lum-2.4.18-um30/fs/ext3/file.c uml-2.4.18-12.5/fs/ext3/file.c ---- lum-2.4.18-um30/fs/ext3/file.c Thu Nov 15 14:37:55 2001 -+++ uml-2.4.18-12.5/fs/ext3/file.c Thu Sep 19 13:40:11 2002 -@@ -61,19 +61,52 @@ - static ssize_t - ext3_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) - { -+ int ret, err; - struct inode *inode = file->f_dentry->d_inode; - -- /* -- * Nasty: if the file is subject to synchronous writes then we need -- * to force generic_osync_inode() to call ext3_write_inode(). -- * We do that by marking the inode dirty. This adds much more -- * computational expense than we need, but we're going to sync -- * anyway. -- */ -- if (IS_SYNC(inode) || (file->f_flags & O_SYNC)) -- mark_inode_dirty(inode); -+ ret = generic_file_write(file, buf, count, ppos); - -- return generic_file_write(file, buf, count, ppos); -+ /* Skip file flushing code if there was an error, or if nothing -+ was written. */ -+ if (ret <= 0) -+ return ret; -+ -+ /* If the inode is IS_SYNC, or is O_SYNC and we are doing -+ data-journaling, then we need to make sure that we force the -+ transaction to disk to keep all metadata uptodate -+ synchronously. */ -+ -+ if (file->f_flags & O_SYNC) { -+ /* If we are non-data-journaled, then the dirty data has -+ already been flushed to backing store by -+ generic_osync_inode, and the inode has been flushed -+ too if there have been any modifications other than -+ mere timestamp updates. -+ -+ Open question --- do we care about flushing -+ timestamps too if the inode is IS_SYNC? */ -+ if (!ext3_should_journal_data(inode)) -+ return ret; -+ -+ goto force_commit; -+ } -+ -+ /* So we know that there has been no forced data flush. If the -+ inode is marked IS_SYNC, we need to force one ourselves. */ -+ if (!IS_SYNC(inode)) -+ return ret; -+ -+ /* Open question #2 --- should we force data to disk here too? -+ If we don't, the only impact is that data=writeback -+ filesystems won't flush data to disk automatically on -+ IS_SYNC, only metadata (but historically, that is what ext2 -+ has done.) */ -+ -+force_commit: -+ err = ext3_force_commit(inode->i_sb); -+ if (err) -+ return err; -+ return ret; - } - - struct file_operations ext3_file_operations = { -diff -ru lum-2.4.18-um30/fs/ext3/fsync.c uml-2.4.18-12.5/fs/ext3/fsync.c ---- lum-2.4.18-um30/fs/ext3/fsync.c Tue Nov 20 22:34:13 2001 -+++ uml-2.4.18-12.5/fs/ext3/fsync.c Thu Sep 19 13:40:11 2002 -@@ -62,7 +62,12 @@ - * we'll end up waiting on them in commit. - */ - ret = fsync_inode_buffers(inode); -- ret |= fsync_inode_data_buffers(inode); -+ -+ /* In writeback mode, we need to force out data buffers too. In -+ * the other modes, ext3_force_commit takes care of forcing out -+ * just the right data blocks. */ -+ if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA) -+ ret |= fsync_inode_data_buffers(inode); - - ext3_force_commit(inode->i_sb); - -diff -ru lum-2.4.18-um30/fs/ext3/ialloc.c uml-2.4.18-12.5/fs/ext3/ialloc.c ---- lum-2.4.18-um30/fs/ext3/ialloc.c Mon Feb 25 12:38:08 2002 -+++ uml-2.4.18-12.5/fs/ext3/ialloc.c Thu Sep 19 13:40:11 2002 -@@ -392,7 +392,7 @@ - - err = -ENOSPC; - if (!gdp) -- goto fail; -+ goto out; - - err = -EIO; - bitmap_nr = load_inode_bitmap (sb, i); -@@ -523,9 +523,10 @@ - return inode; - - fail: -+ ext3_std_error(sb, err); -+out: - unlock_super(sb); - iput(inode); -- ext3_std_error(sb, err); - return ERR_PTR(err); - } - -diff -ru lum-2.4.18-um30/fs/ext3/inode.c uml-2.4.18-12.5/fs/ext3/inode.c ---- lum-2.4.18-um30/fs/ext3/inode.c Mon Feb 25 12:38:08 2002 -+++ uml-2.4.18-12.5/fs/ext3/inode.c Thu Sep 19 13:40:11 2002 -@@ -412,6 +412,7 @@ - return NULL; - - changed: -+ brelse(bh); - *err = -EAGAIN; - goto no_block; - failure: -@@ -581,8 +582,6 @@ - - parent = nr; - } -- if (IS_SYNC(inode)) -- handle->h_sync = 1; - } - if (n == num) - return 0; -@@ -1015,8 +1018,8 @@ - unsigned from, unsigned to) - { - struct inode *inode = page->mapping->host; -- handle_t *handle = ext3_journal_current_handle(); - int ret, needed_blocks = ext3_writepage_trans_blocks(inode); -+ handle_t *handle; - - lock_kernel(); - handle = ext3_journal_start(inode, needed_blocks); -diff -ru lum-2.4.18-um30/fs/ext3/namei.c uml-2.4.18-12.5/fs/ext3/namei.c ---- lum-2.4.18-um30/fs/ext3/namei.c Fri Nov 9 15:25:04 2001 -+++ uml-2.4.18-12.5/fs/ext3/namei.c Thu Sep 19 13:40:11 2002 -@@ -354,8 +355,8 @@ - */ - dir->i_mtime = dir->i_ctime = CURRENT_TIME; - dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); - dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); - BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, bh); - brelse(bh); -@@ -464,8 +465,8 @@ - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); -+ ext3_mark_inode_dirty(handle, inode); - } - ext3_journal_stop(handle, dir); - return err; -@@ -489,8 +490,8 @@ - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - init_special_inode(inode, mode, rdev); -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); -+ ext3_mark_inode_dirty(handle, inode); - } - ext3_journal_stop(handle, dir); - return err; -@@ -933,8 +934,8 @@ - inode->i_size = l-1; - } - inode->u.ext3_i.i_disksize = inode->i_size; -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); -+ ext3_mark_inode_dirty(handle, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -@@ -970,8 +971,8 @@ - ext3_inc_count(handle, inode); - atomic_inc(&inode->i_count); - -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); -+ ext3_mark_inode_dirty(handle, inode); - ext3_journal_stop(handle, dir); - return err; - } -diff -ru lum-2.4.18-um30/fs/ext3/super.c uml-2.4.18-12.5/fs/ext3/super.c ---- lum-2.4.18-um30/fs/ext3/super.c Fri Jul 12 17:59:37 2002 -+++ uml-2.4.18-12.5/fs/ext3/super.c Thu Sep 19 13:40:11 2002 -@@ -1589,8 +1589,10 @@ - journal_t *journal = EXT3_SB(sb)->s_journal; - - /* Now we set up the journal barrier. */ -+ unlock_super(sb); - journal_lock_updates(journal); - journal_flush(journal); -+ lock_super(sb); - - /* Journal blocked and flushed, clear needs_recovery flag. */ - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); diff --git a/lustre/kernel_patches/patches/ext3-2.5-noread.patch b/lustre/kernel_patches/patches/ext3-2.5-noread.patch deleted file mode 100644 index 1aa2578934..0000000000 --- a/lustre/kernel_patches/patches/ext3-2.5-noread.patch +++ /dev/null @@ -1,266 +0,0 @@ -===== fs/ext3/ialloc.c 1.26 vs edited ===== ---- 1.26/fs/ext3/ialloc.c Fri Feb 14 19:24:09 2003 -+++ edited/fs/ext3/ialloc.c Sat Mar 8 01:20:55 2003 -@@ -195,6 +195,36 @@ - } - - /* -+ * @block_group: block group of inode -+ * @offset: relative offset of inode within @block_group -+ * -+ * Check whether any of the inodes in this disk block are in use. -+ * -+ * Caller must be holding superblock lock (group/bitmap read lock in -+ * future). -+ */ -+int ext3_itable_block_used(struct super_block *sb, unsigned int block_group, -+ int offset) -+{ -+ struct buffer_head *ibitmap = read_inode_bitmap(sb, block_group); -+ int inodes_per_block; -+ unsigned long inum, iend; -+ -+ if (!ibitmap) -+ return 1; -+ -+ inodes_per_block = sb->s_blocksize / EXT3_SB(sb)->s_inode_size; -+ inum = offset & ~(inodes_per_block - 1); -+ iend = inum + inodes_per_block; -+ for (; inum < iend; inum++) { -+ if (inum != offset && ext3_test_bit(inum, ibitmap->b_data)) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/* - * There are two policies for allocating an inode. If the new inode is - * a directory, then a forward search is made for a block group with both - * free space and a low directory-to-inode ratio; if that fails, then of -@@ -422,8 +452,9 @@ - struct ext3_group_desc * gdp; - struct ext3_super_block * es; - struct ext3_inode_info *ei; -- int err = 0; -+ struct ext3_iloc iloc; - struct inode *ret; -+ int err = 0; - - /* Cannot create files in a deleted directory */ - if (!dir || !dir->i_nlink) -@@ -587,16 +618,23 @@ - goto fail2; - } - err = ext3_init_acl(handle, inode, dir); -+ if (err) -+ goto fail3; -+ -+ err = ext3_get_inode_loc_new(inode, &iloc, 1); -+ if (err) -+ goto fail3; -+ -+ BUFFER_TRACE(iloc->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, iloc.bh); - if (err) { -- DQUOT_FREE_INODE(inode); -- goto fail2; -- } -- err = ext3_mark_inode_dirty(handle, inode); -- if (err) { -- ext3_std_error(sb, err); -- DQUOT_FREE_INODE(inode); -- goto fail2; -- } -+ brelse(iloc.bh); -+ iloc.bh = NULL; -+ goto fail3; -+ } -+ err = ext3_mark_iloc_dirty(handle, inode, &iloc); -+ if (err) -+ goto fail3; - - ext3_debug("allocating inode %lu\n", inode->i_ino); - goto really_out; -@@ -610,6 +648,9 @@ - brelse(bitmap_bh); - return ret; - -+fail3: -+ ext3_std_error(sb, err); -+ DQUOT_FREE_INODE(inode); - fail2: - inode->i_flags |= S_NOQUOTA; - inode->i_nlink = 0; -===== fs/ext3/inode.c 1.62 vs edited ===== ---- 1.62/fs/ext3/inode.c Fri Feb 14 19:24:09 2003 -+++ edited/fs/ext3/inode.c Sat Mar 8 02:10:39 2003 -@@ -2144,69 +2144,118 @@ - unlock_kernel(); - } - --/* -- * ext3_get_inode_loc returns with an extra refcount against the -- * inode's underlying buffer_head on success. -- */ -+#define NUM_INODE_PREREAD 16 - --int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc) -+/* -+ * ext3_get_inode_loc returns with an extra refcount against the inode's -+ * underlying buffer_head on success. If this is for a new inode allocation -+ * (new is non-zero) then we may be able to optimize away the read if there -+ * are no other in-use inodes in this inode table block. If we need to do -+ * a read, then read in a whole chunk of blocks to avoid blocking again soon -+ * if we are doing lots of creates/updates. -+ */ -+int ext3_get_inode_loc_new(struct inode *inode, struct ext3_iloc *iloc, int new) - { -- struct buffer_head *bh = 0; -+ struct buffer_head *bh[NUM_INODE_PREREAD]; -+ struct super_block *sb = inode->i_sb; -+ struct ext3_sb_info *sbi = EXT3_SB(sb); -+ unsigned long ino = inode->i_ino; - unsigned long block; - unsigned long block_group; - unsigned long group_desc; - unsigned long desc; - unsigned long offset; - struct ext3_group_desc * gdp; -- -- if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_JOURNAL_INO && -- inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || -- inode->i_ino > le32_to_cpu( -- EXT3_SB(inode->i_sb)->s_es->s_inodes_count)) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "bad inode number: %lu", inode->i_ino); -+ -+ if ((ino != EXT3_ROOT_INO && ino != EXT3_JOURNAL_INO && -+ ino < EXT3_FIRST_INO(sb)) || -+ ino > le32_to_cpu(sbi->s_es->s_inodes_count)) { -+ ext3_error(sb, "ext3_get_inode_loc", "bad inode number: %lu", -+ ino); - goto bad_inode; - } -- block_group = (inode->i_ino - 1) / EXT3_INODES_PER_GROUP(inode->i_sb); -- if (block_group >= EXT3_SB(inode->i_sb)->s_groups_count) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "group >= groups count"); -+ block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb); -+ if (block_group >= EXT3_SB(sb)->s_groups_count) { -+ ext3_error(sb, "ext3_get_inode_loc", "group >= groups count"); - goto bad_inode; - } -- group_desc = block_group >> EXT3_DESC_PER_BLOCK_BITS(inode->i_sb); -- desc = block_group & (EXT3_DESC_PER_BLOCK(inode->i_sb) - 1); -- bh = EXT3_SB(inode->i_sb)->s_group_desc[group_desc]; -- if (!bh) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "Descriptor not loaded"); -+ group_desc = block_group >> EXT3_DESC_PER_BLOCK_BITS(sb); -+ desc = block_group & (EXT3_DESC_PER_BLOCK(sb) - 1); -+ if (!sbi->s_group_desc[group_desc]) { -+ ext3_error(sb, "ext3_get_inode_loc", "Descriptor not loaded"); - goto bad_inode; - } - -- gdp = (struct ext3_group_desc *) bh->b_data; -+ gdp = (struct ext3_group_desc *)(sbi->s_group_desc[group_desc]->b_data); - /* - * Figure out the offset within the block group inode table - */ -- offset = ((inode->i_ino - 1) % EXT3_INODES_PER_GROUP(inode->i_sb)) * -- EXT3_INODE_SIZE(inode->i_sb); -+ offset = ((ino - 1) % EXT3_INODES_PER_GROUP(sb)); - block = le32_to_cpu(gdp[desc].bg_inode_table) + -- (offset >> EXT3_BLOCK_SIZE_BITS(inode->i_sb)); -- if (!(bh = sb_bread(inode->i_sb, block))) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "unable to read inode block - " -- "inode=%lu, block=%lu", inode->i_ino, block); -- goto bad_inode; -+ (offset * sbi->s_inode_size >> EXT3_BLOCK_SIZE_BITS(sb)); -+ bh[0] = sb_getblk(sb, block); -+ if (buffer_uptodate(bh[0])) -+ goto done; -+ -+ /* If we don't really need to read this block, and it isn't already -+ * in memory, then we just zero it out. Otherwise, we keep the -+ * current block contents (deleted inode data) for posterity. -+ */ -+ if (new && !ext3_itable_block_used(sb, block_group, offset)) { -+ lock_buffer(bh[0]); -+ memset(bh[0]->b_data, 0, bh[0]->b_size); -+ set_buffer_uptodate(bh[0]); -+ unlock_buffer(bh[0]); -+ } else { -+ unsigned long block_end, itable_end; -+ int count = 1; -+ -+ itable_end = le32_to_cpu(gdp[desc].bg_inode_table) + -+ sbi->s_itb_per_group; -+ block_end = block + NUM_INODE_PREREAD; -+ if (block_end > itable_end) -+ block_end = itable_end; -+ -+ for (++block; block < block_end; block++) { -+ bh[count] = sb_getblk(sb, block); -+ if (count && (buffer_uptodate(bh[count]) || -+ buffer_locked(bh[count]))) { -+ __brelse(bh[count]); -+ } else -+ count++; -+ } -+ -+ ll_rw_block(READ, count, bh); -+ -+ /* Release all but the block we actually need (bh[0]) */ -+ while (--count > 0) -+ __brelse(bh[count]); -+ -+ wait_on_buffer(bh[0]); -+ if (!buffer_uptodate(bh[0])) { -+ ext3_error(sb, __FUNCTION__, -+ "unable to read inode block - " -+ "inode=%lu, block=%llu", ino, -+ (unsigned long long)bh[0]->b_blocknr); -+ goto bad_inode; -+ } - } -- offset &= (EXT3_BLOCK_SIZE(inode->i_sb) - 1); -+done: -+ offset = (offset * sbi->s_inode_size) & (EXT3_BLOCK_SIZE(sb) - 1); - -- iloc->bh = bh; -- iloc->raw_inode = (struct ext3_inode *) (bh->b_data + offset); -+ iloc->bh = bh[0]; -+ iloc->raw_inode = (struct ext3_inode *)(bh[0]->b_data + offset); - iloc->block_group = block_group; -- -+ - return 0; -- -+ - bad_inode: - return -EIO; -+} -+ -+int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc) -+{ -+ return ext3_get_inode_loc_new(inode, iloc, 0); - } - - void ext3_read_inode(struct inode * inode) -===== include/linux/ext3_fs.h 1.22 vs edited ===== ---- 1.22/include/linux/ext3_fs.h Tue Jan 14 00:56:29 2003 -+++ edited/include/linux/ext3_fs.h Sat Mar 8 01:56:28 2003 -@@ -719,6 +719,8 @@ - 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_itable_block_used(struct super_block *, unsigned int, int); -+extern int ext3_get_inode_loc_new(struct inode *, struct ext3_iloc *, 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); diff --git a/lustre/kernel_patches/patches/ext3-2.5.63.patch b/lustre/kernel_patches/patches/ext3-2.5.63.patch deleted file mode 100644 index fd28cd8501..0000000000 --- a/lustre/kernel_patches/patches/ext3-2.5.63.patch +++ /dev/null @@ -1,150 +0,0 @@ - fs/ext3/inode.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- - fs/ext3/super.c | 5 ++- - fs/ext3/xattr.c | 5 +++ - fs/ext3/xattr.h | 2 - - 4 files changed, 92 insertions(+), 4 deletions(-) - ---- linux-2.5.63-nointent/fs/ext3/xattr.c~ext3-2.5.63 Fri Mar 21 18:47:19 2003 -+++ linux-2.5.63-nointent-root/fs/ext3/xattr.c Fri Mar 21 18:47:19 2003 -@@ -1181,3 +1181,8 @@ exit_ext3_xattr(void) - ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, - &ext3_xattr_user_handler); - } -+ -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_set); -+EXPORT_SYMBOL(ext3_xattr_set_handle); -+ ---- linux-2.5.63-nointent/fs/ext3/inode.c~ext3-2.5.63 Fri Mar 21 18:47:19 2003 -+++ linux-2.5.63-nointent-root/fs/ext3/inode.c Fri Mar 21 18:47:19 2003 -@@ -1019,7 +1019,7 @@ struct buffer_head *ext3_bread(handle_t - *err = -EIO; - return NULL; - } -- -+EXPORT_SYMBOL(ext3_bread); - static int walk_page_buffers( handle_t *handle, - struct buffer_head *head, - unsigned from, -@@ -2870,3 +2870,85 @@ int ext3_change_inode_journal_flag(struc - * here, in ext3_aops_journal_start() to ensure that the forthcoming "see if we - * need to extend" test in ext3_prepare_write() succeeds. - */ -+ -+/* for each block: 1 ind + 1 dind + 1 tind -+ * for each block: 3 bitmap blocks -+ * for each block: 3 group descriptor blocks -+ * i inode block -+ * 1 superblock -+ * 2 * EXT3_SINGLEDATA_TRANS_BLOCKS for the quote files -+ * ((1+1+1) * 3 * nblocks) + 1 + 1 + 2 * EXT3_SINGLEDATA_TRANS_BLOCKS -+ * -+ * XXX assuming: -+ * (1) fs logic block size == page size -+ * (2) ext3 in writeback mode -+ */ -+static inline int ext3_san_write_trans_blocks(int nblocks) -+{ -+ int ret; -+ -+ ret = (1 + 1 + 1) * 3 * nblocks + 1 + 1; -+ -+#ifdef CONFIG_QUOTA -+ ret += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS; -+#endif -+ -+ return ret; -+} -+ -+/* Alloc blocks for an inode, while don't create any buffer/page -+ * for data I/O; set the inode size if file is extended. -+ * -+ * @inode: target inode -+ * @blocks: array of logic block number -+ * @nblocks: how many blocks need be alloced -+ * @newsize: new filesize we should set -+ * -+ * return: 0 success, otherwise failed -+ * (*blocks) contains physical block number alloced -+ * -+ * XXX this assume the fs block size == page size -+ */ -+int ext3_prep_san_write(struct inode *inode, long *blocks, -+ int nblocks, loff_t newsize) -+{ -+ handle_t *handle; -+ struct buffer_head bh_tmp; -+ int needed_blocks; -+ int i, ret = 0, ret2; -+ -+ needed_blocks = ext3_san_write_trans_blocks(nblocks); -+ -+ lock_kernel(); -+ handle = ext3_journal_start(inode, needed_blocks); -+ if (IS_ERR(handle)) { -+ unlock_kernel(); -+ return PTR_ERR(handle); -+ } -+ unlock_kernel(); -+ -+ /* alloc blocks one by one */ -+ for (i = 0; i < nblocks; i++) { -+ ret = ext3_get_block_handle(handle, inode, blocks[i], -+ &bh_tmp, 1, 1); -+ if (ret) -+ break; -+ -+ blocks[i] = bh_tmp.b_blocknr; -+ } -+ -+ /* set inode size if needed */ -+ if (!ret && (newsize > inode->i_size)) { -+ inode->i_size = newsize; -+ ext3_mark_inode_dirty(handle, inode); -+ } -+ -+ lock_kernel(); -+ ret2 = ext3_journal_stop(handle, inode); -+ unlock_kernel(); -+ -+ if (!ret) -+ ret = ret2; -+ return ret; -+} -+EXPORT_SYMBOL(ext3_prep_san_write); ---- linux-2.5.63-nointent/fs/ext3/super.c~ext3-2.5.63 Fri Mar 21 18:47:19 2003 -+++ linux-2.5.63-nointent-root/fs/ext3/super.c Fri Mar 21 18:47:19 2003 -@@ -1492,10 +1492,10 @@ static journal_t *ext3_get_dev_journal(s - printk(KERN_ERR "EXT3-fs: I/O error on journal device\n"); - goto out_journal; - } -- if (ntohl(journal->j_superblock->s_nr_users) != 1) { -+ if (be32_to_cpu(journal->j_superblock->s_nr_users) != 1) { - printk(KERN_ERR "EXT3-fs: External journal has more than one " - "user (unsupported) - %d\n", -- ntohl(journal->j_superblock->s_nr_users)); -+ be32_to_cpu(journal->j_superblock->s_nr_users)); - goto out_journal; - } - EXT3_SB(sb)->journal_bdev = bdev; -@@ -1703,6 +1703,7 @@ int ext3_force_commit(struct super_block - unlock_kernel(); - return ret; - } -+EXPORT_SYMBOL(ext3_force_commit); - - /* - * Ext3 always journals updates to the superblock itself, so we don't ---- linux-2.5.63-nointent/fs/ext3/xattr.h~ext3-2.5.63 Fri Mar 21 18:47:19 2003 -+++ linux-2.5.63-nointent-root/fs/ext3/xattr.h Fri Mar 21 18:47:19 2003 -@@ -5,7 +5,7 @@ - - (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> - */ -- -+#include <linux/module.h> - #include <linux/config.h> - #include <linux/xattr.h> - - -_ diff --git a/lustre/kernel_patches/patches/ext3-error-export.patch b/lustre/kernel_patches/patches/ext3-error-export.patch new file mode 100644 index 0000000000..c52fc18ffc --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-error-export.patch @@ -0,0 +1,16 @@ + fs/ext3/ext3-exports.c | 5 +++++ + 1 files changed, 5 insertions(+) + +--- linux/fs/ext3/ext3-exports.c~ext3-error-export Mon Jul 14 19:30:50 2003 ++++ linux-mmonroe/fs/ext3/ext3-exports.c Mon Jul 14 19:32:37 2003 +@@ -21,3 +21,8 @@ EXPORT_SYMBOL(ext3_xattr_list); + EXPORT_SYMBOL(ext3_xattr_set); + EXPORT_SYMBOL(ext3_prep_san_write); + EXPORT_SYMBOL(ext3_map_inode_page); ++ ++EXPORT_SYMBOL(ext3_abort); ++EXPORT_SYMBOL(ext3_decode_error); ++EXPORT_SYMBOL(__ext3_std_error); ++ + +_ diff --git a/lustre/kernel_patches/patches/ext3-map_inode_page.patch b/lustre/kernel_patches/patches/ext3-map_inode_page.patch new file mode 100644 index 0000000000..80f14de6a7 --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-map_inode_page.patch @@ -0,0 +1,84 @@ + + + + fs/ext3/ext3-exports.c | 3 ++ + fs/ext3/inode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 58 insertions(+) + +--- linux-2.4.20-l18/fs/ext3/inode.c~ext3-map_inode_page Tue Jul 8 20:07:23 2003 ++++ linux-2.4.20-l18-phil/fs/ext3/inode.c Wed Jul 9 03:56:41 2003 +@@ -2867,3 +2867,58 @@ int ext3_prep_san_write(struct inode *in + ret = ret2; + return ret; + } ++ ++int ext3_map_inode_page(struct inode *inode, struct page *page, ++ unsigned long *blocks, int *created, int create) ++{ ++ unsigned int blocksize, blocks_per_page; ++ unsigned long iblock; ++ struct buffer_head dummy; ++ void *handle; ++ int i, rc = 0, failed = 0, needed_blocks; ++ ++ blocksize = inode->i_sb->s_blocksize; ++ blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits; ++ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); ++ ++ for (i = 0; i < blocks_per_page; i++, iblock++) { ++ blocks[i] = ext3_bmap(inode->i_mapping, iblock); ++ if (blocks[i] == 0) { ++ failed++; ++ created[i] = -1; ++ } else { ++ created[i] = 0; ++ } ++ } ++ ++ if (failed == 0 || create == 0) ++ return 0; ++ ++ needed_blocks = ext3_writepage_trans_blocks(inode) * failed; ++ lock_kernel(); ++ handle = ext3_journal_start(inode, needed_blocks); ++ unlock_kernel(); ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); ++ ++ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); ++ for (i = 0; i < blocks_per_page; i++, iblock++) { ++ if (blocks[i] != 0) ++ continue; ++ ++ rc = ext3_get_block_handle(handle, inode, iblock, &dummy, 1); ++ if (rc) { ++ printk(KERN_INFO "ext3_map_inode_page: error reading " ++ "block %ld\n", iblock); ++ goto out; ++ } ++ blocks[i] = dummy.b_blocknr; ++ created[i] = 1; ++ } ++ ++ out: ++ lock_kernel(); ++ ext3_journal_stop(handle, inode); ++ unlock_kernel(); ++ return rc; ++} +--- linux-2.4.20-l18/fs/ext3/ext3-exports.c~ext3-map_inode_page Tue Jul 8 20:07:10 2003 ++++ linux-2.4.20-l18-phil/fs/ext3/ext3-exports.c Tue Jul 8 20:09:02 2003 +@@ -9,6 +9,8 @@ + + int ext3_prep_san_write(struct inode *inode, long *blocks, + int nblocks, loff_t newsize); ++int ext3_map_inode_page(struct inode *inode, struct page *page, ++ unsigned long *block, int *created, int create); + + EXPORT_SYMBOL(ext3_force_commit); + EXPORT_SYMBOL(ext3_bread); +@@ -18,3 +20,4 @@ EXPORT_SYMBOL(ext3_xattr_get); + EXPORT_SYMBOL(ext3_xattr_list); + EXPORT_SYMBOL(ext3_xattr_set); + EXPORT_SYMBOL(ext3_prep_san_write); ++EXPORT_SYMBOL(ext3_map_inode_page); diff --git a/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch b/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch new file mode 100644 index 0000000000..8386ee30e0 --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch @@ -0,0 +1,86 @@ + + + + fs/ext3/ext3-exports.c | 3 ++ + fs/ext3/inode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 58 insertions(+) + +--- linux-2.4.18-p4smp/fs/ext3/inode.c~ext3-map_inode_page_2.4.18 2003-07-21 22:51:45.000000000 -0600 ++++ linux-2.4.18-p4smp-braam/fs/ext3/inode.c 2003-07-21 22:51:47.000000000 -0600 +@@ -3003,3 +3003,58 @@ int ext3_prep_san_write(struct inode *in + ret = ret2; + return ret; + } ++ ++int ext3_map_inode_page(struct inode *inode, struct page *page, ++ unsigned long *blocks, int *created, int create) ++{ ++ unsigned int blocksize, blocks_per_page; ++ unsigned long iblock; ++ struct buffer_head dummy; ++ void *handle; ++ int i, rc = 0, failed = 0, needed_blocks; ++ ++ blocksize = inode->i_sb->s_blocksize; ++ blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits; ++ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); ++ ++ for (i = 0; i < blocks_per_page; i++, iblock++) { ++ blocks[i] = ext3_bmap(inode->i_mapping, iblock); ++ if (blocks[i] == 0) { ++ failed++; ++ created[i] = -1; ++ } else { ++ created[i] = 0; ++ } ++ } ++ ++ if (failed == 0 || create == 0) ++ return 0; ++ ++ needed_blocks = ext3_writepage_trans_blocks(inode) * failed; ++ lock_kernel(); ++ handle = ext3_journal_start(inode, needed_blocks); ++ unlock_kernel(); ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); ++ ++ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); ++ for (i = 0; i < blocks_per_page; i++, iblock++) { ++ if (blocks[i] != 0) ++ continue; ++ ++ rc = ext3_get_block_handle(handle, inode, iblock, &dummy, 1); ++ if (rc) { ++ printk(KERN_INFO "ext3_map_inode_page: error reading " ++ "block %ld\n", iblock); ++ goto out; ++ } ++ blocks[i] = dummy.b_blocknr; ++ created[i] = 1; ++ } ++ ++ out: ++ lock_kernel(); ++ ext3_journal_stop(handle, inode); ++ unlock_kernel(); ++ return rc; ++} +--- linux-2.4.18-p4smp/fs/ext3/ext3-exports.c~ext3-map_inode_page_2.4.18 2003-07-21 22:51:45.000000000 -0600 ++++ linux-2.4.18-p4smp-braam/fs/ext3/ext3-exports.c 2003-07-21 22:51:47.000000000 -0600 +@@ -9,6 +9,8 @@ + + int ext3_prep_san_write(struct inode *inode, long *blocks, + int nblocks, loff_t newsize); ++int ext3_map_inode_page(struct inode *inode, struct page *page, ++ unsigned long *block, int *created, int create); + + EXPORT_SYMBOL(ext3_force_commit); + EXPORT_SYMBOL(ext3_bread); +@@ -18,3 +20,4 @@ EXPORT_SYMBOL(ext3_xattr_get); + EXPORT_SYMBOL(ext3_xattr_list); + EXPORT_SYMBOL(ext3_xattr_set); + EXPORT_SYMBOL(ext3_prep_san_write); ++EXPORT_SYMBOL(ext3_map_inode_page); + +_ diff --git a/lustre/kernel_patches/patches/ext3-noread-inode.patch b/lustre/kernel_patches/patches/ext3-noread-inode.patch new file mode 100644 index 0000000000..a50d12b068 --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-noread-inode.patch @@ -0,0 +1,177 @@ + +ext3_get_inode_loc() read inode's block only if: + 1) this inode has no copy in memory + 2) inode's block has another valid inode(s) + +this optimization allows to avoid needless I/O in two cases: +1) just allocated inode is first valid in the inode's block +2) kernel wants to write inode, but buffer in which inode + belongs to gets freed by VM + + + + +diff -puN fs/ext3/inode.c~ext3-noread-inode fs/ext3/inode.c +--- linux-2.5.73/fs/ext3/inode.c~ext3-noread-inode Thu Jul 10 12:03:52 2003 ++++ linux-2.5.73-alexey/fs/ext3/inode.c Thu Jul 10 15:52:59 2003 +@@ -2286,7 +2286,7 @@ out_stop: + * inode's underlying buffer_head on success. + */ + +-int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc) ++int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc, int in_mem) + { + struct buffer_head *bh = 0; + unsigned long block; +@@ -2328,12 +2328,88 @@ int ext3_get_inode_loc (struct inode *in + EXT3_INODE_SIZE(inode->i_sb); + block = le32_to_cpu(gdp[desc].bg_inode_table) + + (offset >> EXT3_BLOCK_SIZE_BITS(inode->i_sb)); +- if (!(bh = sb_bread(inode->i_sb, block))) { ++ if (!(bh = sb_getblk(inode->i_sb, block))) { + ext3_error (inode->i_sb, "ext3_get_inode_loc", + "unable to read inode block - " + "inode=%lu, block=%lu", inode->i_ino, block); + goto bad_inode; + } ++ if (!buffer_uptodate(bh)) { ++ lock_buffer(bh); ++ if (buffer_uptodate(bh)) { ++ /* someone has already initialized buffer */ ++ 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 start; ++ ++ /* ++ * if this inode is only valid in buffer we need not I/O ++ */ ++ 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); ++ ++ /* check is inode bitmap is 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 inode bitmap isn't in cache then we may end up by 2 reads ++ * instead of 1 read before optimizing. 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 inodes (but our) are free. so, we skip I/O */ ++ memset(bh->b_data, 0, bh->b_size); ++ set_buffer_uptodate(bh); ++ unlock_buffer(bh); ++ goto has_buffer; ++ } ++ } ++ ++make_io: ++ /* ++ * No, there are another valid inodes in the buffer ++ * so, to preserve them we have to read buffer from ++ * the 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); ++ goto bad_inode; ++ } ++ } ++ has_buffer: + offset &= (EXT3_BLOCK_SIZE(inode->i_sb) - 1); + + iloc->bh = bh; +@@ -2376,7 +2452,7 @@ void ext3_read_inode(struct inode * inod + endif + if (ext3_iopen_get_inode(inode)) + return; +- if (ext3_get_inode_loc(inode, &iloc)) ++ if (ext3_get_inode_loc(inode, &iloc, 0)) + goto bad_inode; + bh = iloc.bh; + raw_inode = iloc.raw_inode; +@@ -2781,7 +2857,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); +@@ -2879,7 +2955,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); +diff -puN fs/ext3/ialloc.c~ext3-noread-inode fs/ext3/ialloc.c +--- linux-2.5.73/fs/ext3/ialloc.c~ext3-noread-inode Thu Jul 10 13:05:37 2003 ++++ linux-2.5.73-alexey/fs/ext3/ialloc.c Thu Jul 10 13:06:12 2003 +@@ -50,7 +50,7 @@ + * + * Return buffer_head of bitmap on success or NULL. + */ +-static struct buffer_head * ++struct buffer_head * + read_inode_bitmap(struct super_block * sb, unsigned long block_group) + { + struct ext3_group_desc *desc; +diff -puN include/linux/ext3_fs.h~ext3-noread-inode include/linux/ext3_fs.h +--- linux-2.5.73/include/linux/ext3_fs.h~ext3-noread-inode Thu Jul 10 13:41:59 2003 ++++ linux-2.5.73-alexey/include/linux/ext3_fs.h Thu Jul 10 14:40:13 2003 +@@ -717,6 +717,8 @@ extern unsigned long ext3_count_free_ino + extern unsigned long ext3_count_dirs (struct super_block *); + extern void ext3_check_inodes_bitmap (struct super_block *); + extern unsigned long ext3_count_free (struct buffer_head *, unsigned); ++extern struct buffer_head * read_inode_bitmap(struct super_block *, unsigned long); ++ + + + /* inode.c */ +@@ -724,7 +726,7 @@ 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 int ext3_get_inode_loc (struct inode *, struct ext3_iloc *, int); + extern void ext3_read_inode (struct inode *); + extern void ext3_write_inode (struct inode *, int); + extern int ext3_setattr (struct dentry *, struct iattr *); + +_ diff --git a/lustre/kernel_patches/patches/extN-san.patch b/lustre/kernel_patches/patches/ext3-san-jdike-2.5.73.patch similarity index 78% rename from lustre/kernel_patches/patches/extN-san.patch rename to lustre/kernel_patches/patches/ext3-san-jdike-2.5.73.patch index d58fe8c570..afda0bd8c5 100644 --- a/lustre/kernel_patches/patches/extN-san.patch +++ b/lustre/kernel_patches/patches/ext3-san-jdike-2.5.73.patch @@ -2,12 +2,12 @@ fs/ext3/super.c | 4 ++ 2 files changed, 85 insertions(+) ---- linux-2.4.18-18.8.0-l18/fs/ext3/inode.c~extN-san Sun May 18 12:58:13 2003 -+++ linux-2.4.18-18.8.0-l18-phil/fs/ext3/inode.c Sun May 18 13:24:49 2003 -@@ -2781,3 +2781,84 @@ int ext3_change_inode_journal_flag(struc - * here, in ext3_aops_journal_start() to ensure that the forthcoming "see if we - * need to extend" test in ext3_prepare_write() succeeds. - */ +--- linux-2.5.73/fs/ext3/inode.c~ext3-san-jdike-2.5.73 2003-06-22 12:32:58.000000000 -0600 ++++ linux-2.5.73-braam/fs/ext3/inode.c 2003-06-30 12:19:21.000000000 -0600 +@@ -2945,3 +2945,84 @@ int ext3_change_inode_journal_flag(struc + + return err; + } + +/* for each block: 1 ind + 1 dind + 1 tind + * for each block: 3 bitmap blocks @@ -68,7 +68,7 @@ + /* alloc blocks one by one */ + for (i = 0; i < nblocks; i++) { + ret = ext3_get_block_handle(handle, inode, blocks[i], -+ &bh_tmp, 1); ++ &bh_tmp, 1, 1); + if (ret) + break; + @@ -82,18 +82,18 @@ + } + + lock_kernel(); -+ ret2 = ext3_journal_stop(handle, inode); ++ ret2 = ext3_journal_stop(handle); + unlock_kernel(); + + if (!ret) + ret = ret2; + return ret; +} ---- linux-2.4.18-18.8.0-l18/fs/ext3/super.c~extN-san Sun May 18 13:24:35 2003 -+++ linux-2.4.18-18.8.0-l18-phil/fs/ext3/super.c Sun May 18 13:24:55 2003 -@@ -1774,6 +1774,10 @@ static int __init init_ext3_fs(void) - - EXPORT_SYMBOL(ext3_bread); +--- linux-2.5.73/fs/ext3/super.c~ext3-san-jdike-2.5.73 2003-06-22 12:33:16.000000000 -0600 ++++ linux-2.5.73-braam/fs/ext3/super.c 2003-06-30 12:16:36.000000000 -0600 +@@ -2080,6 +2080,10 @@ static void __exit exit_ext3_fs(void) + exit_ext3_xattr(); + } +int ext3_prep_san_write(struct inode *inode, long *blocks, + int nblocks, loff_t newsize); diff --git a/lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch b/lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch deleted file mode 100644 index ce3928d869..0000000000 --- a/lustre/kernel_patches/patches/ext3-truncate_blocks-chaos.patch.patch +++ /dev/null @@ -1,92 +0,0 @@ ---- ./fs/ext3/inode.c.orig Wed Mar 12 02:44:06 2003 -+++ ./fs/ext3/inode.c Wed Mar 12 11:55:20 2003 -@@ -99,7 +99,35 @@ int ext3_forget(handle_t *handle, int is - return err; - } - --/* -+/* -+ * Work out how many blocks we need to progress with the next chunk of a -+ * truncate transaction. -+ */ -+ -+static unsigned long blocks_for_truncate(struct inode *inode) -+{ -+ unsigned long needed; -+ -+ needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9); -+ -+ /* Give ourselves just enough room to cope with inodes in which -+ * i_blocks is corrupt: we've seen disk corruptions in the past -+ * which resulted in random data in an inode which looked enough -+ * like a regular file for ext3 to try to delete it. Things -+ * will go a bit crazy if that happens, but at least we should -+ * try not to panic the whole kernel. */ -+ if (needed < 2) -+ needed = 2; -+ -+ /* But we need to bound the transaction so we don't overflow the -+ * journal. */ -+ if (needed > EXT3_MAX_TRANS_DATA) -+ needed = EXT3_MAX_TRANS_DATA; -+ -+ return EXT3_DATA_TRANS_BLOCKS + needed; -+} -+ -+/* - * Truncate transactions can be complex and absolutely huge. So we need to - * be able to restart the transaction at a conventient checkpoint to make - * sure we don't overflow the journal. -@@ -110,19 +138,14 @@ int ext3_forget(handle_t *handle, int is - * transaction in the top-level truncate loop. --sct - */ - --static handle_t *start_transaction(struct inode *inode) -+static handle_t *start_transaction(struct inode *inode) - { -- long needed; - handle_t *result; -- -- needed = inode->i_blocks; -- if (needed > EXT3_MAX_TRANS_DATA) -- needed = EXT3_MAX_TRANS_DATA; -- -- result = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS + needed); -+ -+ result = ext3_journal_start(inode, blocks_for_truncate(inode)); - if (!IS_ERR(result)) - return result; -- -+ - ext3_std_error(inode->i_sb, PTR_ERR(result)); - return result; - } -@@ -135,14 +158,9 @@ static handle_t *start_transaction(struc - */ - static int try_to_extend_transaction(handle_t *handle, struct inode *inode) - { -- long needed; -- - if (handle->h_buffer_credits > EXT3_RESERVE_TRANS_BLOCKS) - return 0; -- needed = inode->i_blocks; -- if (needed > EXT3_MAX_TRANS_DATA) -- needed = EXT3_MAX_TRANS_DATA; -- if (!ext3_journal_extend(handle, EXT3_RESERVE_TRANS_BLOCKS + needed)) -+ if (!ext3_journal_extend(handle, blocks_for_truncate(inode))) - return 0; - return 1; - } -@@ -154,11 +172,8 @@ static int try_to_extend_transaction(han - */ - static int ext3_journal_test_restart(handle_t *handle, struct inode *inode) - { -- long needed = inode->i_blocks; -- if (needed > EXT3_MAX_TRANS_DATA) -- needed = EXT3_MAX_TRANS_DATA; - jbd_debug(2, "restarting handle %p\n", handle); -- return ext3_journal_restart(handle, EXT3_DATA_TRANS_BLOCKS + needed); -+ return ext3_journal_restart(handle, blocks_for_truncate(inode)); - } - - /* diff --git a/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch b/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch new file mode 100644 index 0000000000..ad873a9d4b --- /dev/null +++ b/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch @@ -0,0 +1,477 @@ + fs/ext3/file.c | 4 + fs/ext3/inode.c | 116 ++++++++++++++++++++++ + fs/ext3/super.c | 230 +++++++++++++++++++++++++++++++++++++++++++++ + include/linux/ext3_fs.h | 5 + include/linux/ext3_fs_sb.h | 10 + + 5 files changed, 365 insertions(+) + +--- kernel-2.4.20-6chaos_18_7/fs/ext3/super.c~ext3_delete_thread_2.4.20_chaos 2003-07-12 15:35:26.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/super.c 2003-07-12 15:36:19.000000000 -0600 +@@ -400,6 +400,220 @@ static void dump_orphan_list(struct supe + } + } + ++#ifdef EXT3_DELETE_THREAD ++/* ++ * Delete inodes in a loop until there are no more to be deleted. ++ * Normally, we run in the background doing the deletes and sleeping again, ++ * and clients just add new inodes to be deleted onto the end of the list. ++ * If someone is concerned about free space (e.g. block allocation or similar) ++ * then they can sleep on s_delete_waiter_queue and be woken up when space ++ * has been freed. ++ */ ++int ext3_delete_thread(void *data) ++{ ++ struct super_block *sb = data; ++ struct ext3_sb_info *sbi = EXT3_SB(sb); ++ struct task_struct *tsk = current; ++ ++ /* Almost like daemonize, but not quite */ ++ exit_mm(current); ++ tsk->session = 1; ++ tsk->pgrp = 1; ++ tsk->tty = NULL; ++ exit_files(current); ++ reparent_to_init(); ++ ++ sprintf(tsk->comm, "kdelext3-%s", kdevname(sb->s_dev)); ++ sigfillset(&tsk->blocked); ++ ++ /*tsk->flags |= PF_KERNTHREAD;*/ ++ ++ INIT_LIST_HEAD(&sbi->s_delete_list); ++ wake_up(&sbi->s_delete_waiter_queue); ++ ext3_debug("delete thread on %s started\n", kdevname(sb->s_dev)); ++ ++ /* main loop */ ++ for (;;) { ++ wait_event_interruptible(sbi->s_delete_thread_queue, ++ !list_empty(&sbi->s_delete_list) || ++ !test_opt(sb, ASYNCDEL)); ++ ext3_debug("%s woken up: %lu inodes, %lu blocks\n", ++ tsk->comm,sbi->s_delete_inodes,sbi->s_delete_blocks); ++ ++ spin_lock(&sbi->s_delete_lock); ++ if (list_empty(&sbi->s_delete_list)) { ++ clear_opt(sbi->s_mount_opt, ASYNCDEL); ++ memset(&sbi->s_delete_list, 0, ++ sizeof(sbi->s_delete_list)); ++ spin_unlock(&sbi->s_delete_lock); ++ ext3_debug("delete thread on %s exiting\n", ++ kdevname(sb->s_dev)); ++ wake_up(&sbi->s_delete_waiter_queue); ++ break; ++ } ++ ++ while (!list_empty(&sbi->s_delete_list)) { ++ struct inode *inode=list_entry(sbi->s_delete_list.next, ++ struct inode, i_dentry); ++ unsigned long blocks = inode->i_blocks >> ++ (inode->i_blkbits - 9); ++ ++ list_del_init(&inode->i_dentry); ++ spin_unlock(&sbi->s_delete_lock); ++ ext3_debug("%s delete ino %lu blk %lu\n", ++ tsk->comm, inode->i_ino, blocks); ++ ++ iput(inode); ++ ++ spin_lock(&sbi->s_delete_lock); ++ sbi->s_delete_blocks -= blocks; ++ sbi->s_delete_inodes--; ++ } ++ if (sbi->s_delete_blocks != 0 || sbi->s_delete_inodes != 0) { ++ ext3_warning(sb, __FUNCTION__, ++ "%lu blocks, %lu inodes on list?\n", ++ sbi->s_delete_blocks,sbi->s_delete_inodes); ++ sbi->s_delete_blocks = 0; ++ sbi->s_delete_inodes = 0; ++ } ++ spin_unlock(&sbi->s_delete_lock); ++ wake_up(&sbi->s_delete_waiter_queue); ++ } ++ ++ return 0; ++} ++ ++static void ext3_start_delete_thread(struct super_block *sb) ++{ ++ struct ext3_sb_info *sbi = EXT3_SB(sb); ++ int rc; ++ ++ spin_lock_init(&sbi->s_delete_lock); ++ init_waitqueue_head(&sbi->s_delete_thread_queue); ++ init_waitqueue_head(&sbi->s_delete_waiter_queue); ++ ++ if (!test_opt(sb, ASYNCDEL)) ++ return; ++ ++ rc = kernel_thread(ext3_delete_thread, sb, CLONE_VM | CLONE_FILES); ++ if (rc < 0) ++ printk(KERN_ERR "EXT3-fs: cannot start delete thread: rc %d\n", ++ rc); ++ else ++ wait_event(sbi->s_delete_waiter_queue, sbi->s_delete_list.next); ++} ++ ++static void ext3_stop_delete_thread(struct ext3_sb_info *sbi) ++{ ++ if (sbi->s_delete_list.next == 0) /* thread never started */ ++ return; ++ ++ clear_opt(sbi->s_mount_opt, ASYNCDEL); ++ wake_up(&sbi->s_delete_thread_queue); ++ wait_event(sbi->s_delete_waiter_queue, list_empty(&sbi->s_delete_list)); ++} ++ ++/* Instead of playing games with the inode flags, destruction, etc we just ++ * create a new inode locally and put it on a list for the truncate thread. ++ * We need large parts of the inode struct in order to complete the ++ * truncate and unlink, so we may as well just have a real inode to do it. ++ * ++ * If we have any problem deferring the delete, just delete it right away. ++ * If we defer it, we also mark how many blocks it would free, so that we ++ * can keep the statfs data correct, and we know if we should sleep on the ++ * delete thread when we run out of space. ++ */ ++static void ext3_delete_inode_thread(struct inode *old_inode) ++{ ++ struct ext3_sb_info *sbi = EXT3_SB(old_inode->i_sb); ++ struct ext3_inode_info *nei, *oei = EXT3_I(old_inode); ++ struct inode *new_inode; ++ unsigned long blocks = old_inode->i_blocks >> (old_inode->i_blkbits-9); ++ ++ if (is_bad_inode(old_inode)) { ++ clear_inode(old_inode); ++ return; ++ } ++ ++ if (!test_opt(old_inode->i_sb, ASYNCDEL) || !sbi->s_delete_list.next) ++ goto out_delete; ++ ++ /* We may want to delete the inode immediately and not defer it */ ++ if (IS_SYNC(old_inode) || blocks <= EXT3_NDIR_BLOCKS) ++ goto out_delete; ++ ++ /* We can't use the delete thread as-is during real orphan recovery, ++ * as we add to the orphan list here, causing ext3_orphan_cleanup() ++ * to loop endlessly. It would be nice to do so, but needs work. ++ */ ++ if (oei->i_state & EXT3_STATE_DELETE || ++ sbi->s_mount_state & EXT3_ORPHAN_FS) { ++ ext3_debug("doing deferred inode %lu delete (%lu blocks)\n", ++ old_inode->i_ino, blocks); ++ goto out_delete; ++ } ++ ++ /* We can iget this inode again here, because our caller has unhashed ++ * old_inode, so new_inode will be in a different inode struct. ++ * ++ * We need to ensure that the i_orphan pointers in the other inodes ++ * point at the new inode copy instead of the old one so the orphan ++ * list doesn't get corrupted when the old orphan inode is freed. ++ */ ++ down(&sbi->s_orphan_lock); ++ ++ sbi->s_mount_state |= EXT3_ORPHAN_FS; ++ new_inode = iget(old_inode->i_sb, old_inode->i_ino); ++ sbi->s_mount_state &= ~EXT3_ORPHAN_FS; ++ if (is_bad_inode(new_inode)) { ++ printk(KERN_WARNING "read bad inode %lu\n", old_inode->i_ino); ++ iput(new_inode); ++ new_inode = NULL; ++ } ++ if (!new_inode) { ++ up(&sbi->s_orphan_lock); ++ ext3_debug("delete inode %lu directly (bad read)\n", ++ old_inode->i_ino); ++ goto out_delete; ++ } ++ J_ASSERT(new_inode != old_inode); ++ ++ J_ASSERT(!list_empty(&oei->i_orphan)); ++ ++ nei = EXT3_I(new_inode); ++ /* Ugh. We need to insert new_inode into the same spot on the list ++ * as old_inode was, to ensure the in-memory orphan list is still ++ * in the same order as the on-disk orphan list (badness otherwise). ++ */ ++ nei->i_orphan = oei->i_orphan; ++ nei->i_orphan.next->prev = &nei->i_orphan; ++ nei->i_orphan.prev->next = &nei->i_orphan; ++ nei->i_state |= EXT3_STATE_DELETE; ++ up(&sbi->s_orphan_lock); ++ ++ clear_inode(old_inode); ++ ++ spin_lock(&sbi->s_delete_lock); ++ J_ASSERT(list_empty(&new_inode->i_dentry)); ++ list_add_tail(&new_inode->i_dentry, &sbi->s_delete_list); ++ sbi->s_delete_blocks += blocks; ++ sbi->s_delete_inodes++; ++ spin_unlock(&sbi->s_delete_lock); ++ ++ ext3_debug("delete inode %lu (%lu blocks) by thread\n", ++ new_inode->i_ino, blocks); ++ ++ wake_up(&sbi->s_delete_thread_queue); ++ return; ++ ++out_delete: ++ ext3_delete_inode(old_inode); ++} ++#else ++#define ext3_start_delete_thread(sbi) do {} while(0) ++#define ext3_stop_delete_thread(sbi) do {} while(0) ++#endif /* EXT3_DELETE_THREAD */ ++ + void ext3_put_super (struct super_block * sb) + { + struct ext3_sb_info *sbi = EXT3_SB(sb); +@@ -407,6 +621,7 @@ void ext3_put_super (struct super_block + kdev_t j_dev = sbi->s_journal->j_dev; + int i; + ++ ext3_stop_delete_thread(sbi); + ext3_xattr_put_super(sb); + journal_destroy(sbi->s_journal); + if (!(sb->s_flags & MS_RDONLY)) { +@@ -455,7 +670,11 @@ static struct super_operations ext3_sops + write_inode: ext3_write_inode, /* BKL not held. Don't need */ + dirty_inode: ext3_dirty_inode, /* BKL not held. We take it */ + put_inode: ext3_put_inode, /* BKL not held. Don't need */ ++#ifdef EXT3_DELETE_THREAD ++ delete_inode: ext3_delete_inode_thread,/* BKL not held. We take it */ ++#else + delete_inode: ext3_delete_inode, /* BKL not held. We take it */ ++#endif + put_super: ext3_put_super, /* BKL held */ + write_super: ext3_write_super, /* BKL held */ + sync_fs: ext3_sync_fs, +@@ -524,6 +743,13 @@ static int parse_options (char * options + clear_opt (*mount_options, XATTR_USER); + else + #endif ++#ifdef EXT3_DELETE_THREAD ++ if (!strcmp(this_char, "asyncdel")) ++ set_opt(*mount_options, ASYNCDEL); ++ else if (!strcmp(this_char, "noasyncdel")) ++ clear_opt(*mount_options, ASYNCDEL); ++ else ++#endif + if (!strcmp (this_char, "bsddf")) + clear_opt (*mount_options, MINIX_DF); + else if (!strcmp (this_char, "nouid32")) { +@@ -1223,6 +1449,7 @@ struct super_block * ext3_read_super (st + } + + ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY); ++ ext3_start_delete_thread(sb); + /* + * akpm: core read_super() calls in here with the superblock locked. + * That deadlocks, because orphan cleanup needs to lock the superblock +@@ -1678,6 +1905,9 @@ int ext3_remount (struct super_block * s + if (!parse_options(data, &tmp, sbi, &tmp, 1)) + return -EINVAL; + ++ if (!test_opt(sb, ASYNCDEL) || (*flags & MS_RDONLY)) ++ ext3_stop_delete_thread(sbi); ++ + if (sbi->s_mount_opt & EXT3_MOUNT_ABORT) + ext3_abort(sb, __FUNCTION__, "Abort forced by user"); + +--- kernel-2.4.20-6chaos_18_7/fs/ext3/inode.c~ext3_delete_thread_2.4.20_chaos 2003-07-12 15:34:44.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/inode.c 2003-07-12 15:36:19.000000000 -0600 +@@ -2017,6 +2017,122 @@ out_stop: + ext3_journal_stop(handle, inode); + } + ++#ifdef EXT3_DELETE_THREAD ++/* Move blocks from to-be-truncated inode over to a new inode, and delete ++ * that one from the delete thread instead. This avoids a lot of latency ++ * when truncating large files. ++ * ++ * If we have any problem deferring the truncate, just truncate it right away. ++ * If we defer it, we also mark how many blocks it would free, so that we ++ * can keep the statfs data correct, and we know if we should sleep on the ++ * delete thread when we run out of space. ++ * ++ * During normal filesystem usage, we are always called here with a ++ * transaction already started. The only time ext3_truncate is called ++ * without a started transaction is from ext3_orphan_cleanup(), and we ++ * currently just do a direct truncate in that case. ++ */ ++void ext3_truncate_thread(struct inode *old_inode) ++{ ++ struct ext3_sb_info *sbi = EXT3_SB(old_inode->i_sb); ++ struct ext3_inode_info *nei, *oei = EXT3_I(old_inode); ++ struct inode *new_inode; ++ handle_t *handle; ++ unsigned long blocks = old_inode->i_blocks >> (old_inode->i_blkbits-9); ++ ++ if (!test_opt(old_inode->i_sb, ASYNCDEL) || !sbi->s_delete_list.next) ++ goto out_truncate; ++ ++ /* XXX This is a temporary limitation for code simplicity. ++ * We could truncate to arbitrary sizes at some later time. ++ */ ++ if (old_inode->i_size != 0) ++ goto out_truncate; ++ ++ /* We may want to truncate the inode immediately and not defer it */ ++ if (IS_SYNC(old_inode) || blocks <= EXT3_NDIR_BLOCKS || ++ old_inode->i_size > oei->i_disksize) ++ goto out_truncate; ++ ++ /* We can't use the delete thread as-is during real orphan recovery, ++ * as we add to the orphan list here, causing ext3_orphan_cleanup() ++ * to loop endlessly. It would be nice to do so, but needs work. ++ */ ++ if (oei->i_state & EXT3_STATE_DELETE || ++ sbi->s_mount_state & EXT3_ORPHAN_FS) { ++ ext3_debug("doing deferred inode %lu delete (%lu blocks)\n", ++ old_inode->i_ino, blocks); ++ goto out_truncate; ++ } ++ ++ ext3_discard_prealloc(old_inode); ++ ++ /* old_inode = 1 ++ * new_inode = sb + GDT + ibitmap ++ * orphan list = 1 inode/superblock for add, 2 inodes for del ++ * quota files = 2 * EXT3_SINGLEDATA_TRANS_BLOCKS ++ */ ++ handle = ext3_journal_start(old_inode, 7); ++ if (IS_ERR(handle)) ++ goto out_truncate; ++ ++ new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode); ++ if (IS_ERR(new_inode)) { ++ ext3_debug("truncate inode %lu directly (no new inodes)\n", ++ old_inode->i_ino); ++ goto out_journal; ++ } ++ ++ if (ext3_orphan_add(handle, new_inode) < 0) ++ goto out_journal; ++ ++ if (ext3_orphan_del(handle, old_inode) < 0) { ++ ext3_orphan_del(handle, new_inode); ++ iput(new_inode); ++ goto out_journal; ++ } ++ ++ nei = EXT3_I(new_inode); ++ ++ down_write(&oei->truncate_sem); ++ new_inode->i_size = old_inode->i_size; ++ new_inode->i_blocks = old_inode->i_blocks; ++ new_inode->i_uid = old_inode->i_uid; ++ new_inode->i_gid = old_inode->i_gid; ++ new_inode->i_nlink = 0; ++ ++ /* FIXME when we do arbitrary truncates */ ++ old_inode->i_blocks = oei->i_file_acl ? old_inode->i_blksize / 512 : 0; ++ ++ memcpy(nei->i_data, oei->i_data, sizeof(nei->i_data)); ++ memset(oei->i_data, 0, sizeof(oei->i_data)); ++ ++ nei->i_disksize = oei->i_disksize; ++ nei->i_state |= EXT3_STATE_DELETE; ++ up_write(&oei->truncate_sem); ++ ++ ext3_journal_stop(handle, old_inode); ++ ++ spin_lock(&sbi->s_delete_lock); ++ J_ASSERT(list_empty(&new_inode->i_dentry)); ++ list_add_tail(&new_inode->i_dentry, &sbi->s_delete_list); ++ sbi->s_delete_blocks += blocks; ++ sbi->s_delete_inodes++; ++ spin_unlock(&sbi->s_delete_lock); ++ ++ ext3_debug("delete inode %lu (%lu blocks) by thread\n", ++ new_inode->i_ino, blocks); ++ ++ wake_up(&sbi->s_delete_thread_queue); ++ return; ++ ++out_journal: ++ ext3_journal_stop(handle, old_inode); ++out_truncate: ++ ext3_truncate(old_inode); ++} ++#endif /* EXT3_DELETE_THREAD */ ++ + /* + * ext3_get_inode_loc returns with an extra refcount against the + * inode's underlying buffer_head on success. +--- kernel-2.4.20-6chaos_18_7/fs/ext3/file.c~ext3_delete_thread_2.4.20_chaos 2003-07-12 15:34:44.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/file.c 2003-07-12 15:36:19.000000000 -0600 +@@ -125,7 +125,11 @@ struct file_operations ext3_file_operati + }; + + struct inode_operations ext3_file_inode_operations = { ++#ifdef EXT3_DELETE_THREAD ++ truncate: ext3_truncate_thread, /* BKL held */ ++#else + truncate: ext3_truncate, /* BKL held */ ++#endif + setattr: ext3_setattr, /* BKL held */ + setxattr: ext3_setxattr, /* BKL held */ + getxattr: ext3_getxattr, /* BKL held */ +--- kernel-2.4.20-6chaos_18_7/include/linux/ext3_fs.h~ext3_delete_thread_2.4.20_chaos 2003-07-12 15:34:44.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_fs.h 2003-07-12 15:37:13.000000000 -0600 +@@ -193,6 +193,7 @@ struct ext3_group_desc + */ + #define EXT3_STATE_JDATA 0x00000001 /* journaled data exists */ + #define EXT3_STATE_NEW 0x00000002 /* inode is newly created */ ++#define EXT3_STATE_DELETE 0x00000010 /* deferred delete inode */ + + /* + * ioctl commands +@@ -320,6 +321,7 @@ struct ext3_inode { + #define EXT3_MOUNT_UPDATE_JOURNAL 0x1000 /* Update the journal format */ + #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ + #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ ++#define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ + + /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ + #ifndef _LINUX_EXT2_FS_H +@@ -695,6 +697,9 @@ extern void ext3_discard_prealloc (struc + extern void ext3_dirty_inode(struct inode *); + extern int ext3_change_inode_journal_flag(struct inode *, int); + extern void ext3_truncate (struct inode *); ++#ifdef EXT3_DELETE_THREAD ++extern void ext3_truncate_thread(struct inode *inode); ++#endif + extern void ext3_set_inode_flags(struct inode *); + + /* ioctl.c */ +--- kernel-2.4.20-6chaos_18_7/include/linux/ext3_fs_sb.h~ext3_delete_thread_2.4.20_chaos 2003-07-12 15:35:26.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_fs_sb.h 2003-07-12 15:36:19.000000000 -0600 +@@ -29,6 +29,8 @@ + + #define EXT3_MAX_GROUP_LOADED 32 + ++#define EXT3_DELETE_THREAD ++ + /* + * third extended-fs super-block data in memory + */ +@@ -76,6 +78,14 @@ struct ext3_sb_info { + struct timer_list turn_ro_timer; /* For turning read-only (crash simulation) */ + wait_queue_head_t ro_wait_queue; /* For people waiting for the fs to go read-only */ + #endif ++#ifdef EXT3_DELETE_THREAD ++ spinlock_t s_delete_lock; ++ struct list_head s_delete_list; ++ unsigned long s_delete_blocks; ++ unsigned long s_delete_inodes; ++ wait_queue_head_t s_delete_thread_queue; ++ wait_queue_head_t s_delete_waiter_queue; ++#endif + }; + + #endif /* _LINUX_EXT3_FS_SB */ + +_ diff --git a/lustre/kernel_patches/patches/extN-delete_thread.patch b/lustre/kernel_patches/patches/extN-delete_thread.patch deleted file mode 100644 index 4248b5c3ff..0000000000 --- a/lustre/kernel_patches/patches/extN-delete_thread.patch +++ /dev/null @@ -1,278 +0,0 @@ - 0 files changed - ---- linux-2.4.18-p4smp-61chaos/include/linux/ext3_fs.h~extN-delete_thread 2003-05-29 10:19:15.000000000 +0800 -+++ linux-2.4.18-p4smp-61chaos-root/include/linux/ext3_fs.h 2003-05-29 10:50:04.000000000 +0800 -@@ -190,6 +190,7 @@ struct ext3_group_desc - */ - #define EXT3_STATE_JDATA 0x00000001 /* journaled data exists */ - #define EXT3_STATE_NEW 0x00000002 /* inode is newly created */ -+#define EXT3_STATE_DELETE 0x00000010 /* deferred delete inode */ - - /* - * ioctl commands ---- linux-2.4.18-p4smp-61chaos/include/linux/ext3_fs_sb.h~extN-delete_thread 2003-05-29 10:19:15.000000000 +0800 -+++ linux-2.4.18-p4smp-61chaos-root/include/linux/ext3_fs_sb.h 2003-05-29 10:50:04.000000000 +0800 -@@ -29,6 +29,8 @@ - - #define EXT3_MAX_GROUP_LOADED 32 - -+#define EXT3_DELETE_THREAD -+ - /* - * third extended-fs super-block data in memory - */ -@@ -74,6 +76,14 @@ struct ext3_sb_info { - struct timer_list turn_ro_timer; /* For turning read-only (crash simulation) */ - wait_queue_head_t ro_wait_queue; /* For people waiting for the fs to go read-only */ - #endif -+#ifdef EXT3_DELETE_THREAD -+ spinlock_t s_delete_lock; -+ struct list_head s_delete_list; -+ unsigned long s_delete_blocks; -+ unsigned long s_delete_inodes; -+ wait_queue_head_t s_delete_thread_queue; -+ wait_queue_head_t s_delete_waiter_queue; -+#endif - }; - - #endif /* _LINUX_EXT3_FS_SB */ ---- linux-2.4.18-p4smp-61chaos/fs/ext3/super.c~extN-delete_thread 2003-05-29 10:19:15.000000000 +0800 -+++ linux-2.4.18-p4smp-61chaos-root/fs/ext3/super.c 2003-05-29 10:50:04.000000000 +0800 -@@ -398,6 +398,207 @@ static void dump_orphan_list(struct supe - } - } - -+#ifdef EXT3_DELETE_THREAD -+/* -+ * Delete inodes in a loop until there are no more to be deleted. -+ * Normally, we run in the background doing the deletes and sleeping again, -+ * and clients just add new inodes to be deleted onto the end of the list. -+ * If someone is concerned about free space (e.g. block allocation or similar) -+ * then they can sleep on s_delete_waiter_queue and be woken up when space -+ * has been freed. -+ */ -+int ext3_delete_thread(void *data) -+{ -+ struct super_block *sb = data; -+ struct ext3_sb_info *sbi = EXT3_SB(sb); -+ struct task_struct *tsk = current; -+ -+ /* Almost like daemonize, but not quite */ -+ exit_mm(current); -+ tsk->session = 1; -+ tsk->pgrp = 1; -+ tsk->tty = NULL; -+ exit_files(current); -+ reparent_to_init(); -+ -+ sprintf(tsk->comm, "kdelext3-%s", kdevname(sb->s_dev)); -+ sigfillset(&tsk->blocked); -+ -+ tsk->flags |= PF_KERNTHREAD; -+ -+ INIT_LIST_HEAD(&sbi->s_delete_list); -+ wake_up(&sbi->s_delete_waiter_queue); -+ printk(KERN_INFO "EXT3-fs: delete thread on %s started\n", -+ kdevname(sb->s_dev)); -+ -+ /* main loop */ -+ for (;;) { -+ sleep_on(&sbi->s_delete_thread_queue); -+ printk(KERN_DEBUG "%s woken up: %lu inodes, %lu blocks\n", -+ tsk->comm, sbi->s_delete_inodes, sbi->s_delete_blocks); -+ -+ spin_lock(&sbi->s_delete_lock); -+ if (list_empty(&sbi->s_delete_list)) { -+ memset(&sbi->s_delete_list, 0, -+ sizeof(sbi->s_delete_list)); -+ spin_unlock(&sbi->s_delete_lock); -+ printk(KERN_DEBUG "ext3 delete thread on %s exiting\n", -+ kdevname(sb->s_dev)); -+ wake_up(&sbi->s_delete_waiter_queue); -+ break; -+ } -+ -+ while (!list_empty(&sbi->s_delete_list)) { -+ struct inode *inode=list_entry(sbi->s_delete_list.next, -+ struct inode, i_dentry); -+ unsigned long blocks = inode->i_blocks >> -+ (inode->i_blkbits - 9); -+ -+ list_del_init(&inode->i_dentry); -+ spin_unlock(&sbi->s_delete_lock); -+ printk(KERN_DEBUG "%s delete ino %lu blk %lu\n", -+ tsk->comm, inode->i_ino, blocks); -+ -+ iput(inode); -+ -+ spin_lock(&sbi->s_delete_lock); -+ sbi->s_delete_blocks -= blocks; -+ sbi->s_delete_inodes--; -+ } -+ if (sbi->s_delete_blocks != 0 || sbi->s_delete_inodes != 0) -+ printk(KERN_WARNING -+ "%lu blocks and %lu left on list?\n", -+ sbi->s_delete_blocks, sbi->s_delete_inodes); -+ sbi->s_delete_blocks = 0; -+ sbi->s_delete_inodes = 0; -+ spin_unlock(&sbi->s_delete_lock); -+ wake_up(&sbi->s_delete_waiter_queue); -+ } -+ -+ return 0; -+} -+ -+static void ext3_start_delete_thread(struct super_block *sb) -+{ -+ struct ext3_sb_info *sbi = EXT3_SB(sb); -+ int rc; -+ -+ spin_lock_init(&sbi->s_delete_lock); -+ memset(&sbi->s_delete_list, 0, sizeof(sbi->s_delete_list)); -+ init_waitqueue_head(&sbi->s_delete_thread_queue); -+ init_waitqueue_head(&sbi->s_delete_waiter_queue); -+ sbi->s_delete_blocks = 0; -+ sbi->s_delete_inodes = 0; -+ rc = kernel_thread(ext3_delete_thread, sb, CLONE_VM | CLONE_FILES); -+ if (rc < 0) -+ printk(KERN_ERR "EXT3-fs: cannot start delete thread: rc %d\n", -+ rc); -+ else -+ wait_event(sbi->s_delete_waiter_queue, sbi->s_delete_list.next); -+} -+ -+static void ext3_stop_delete_thread(struct ext3_sb_info *sbi) -+{ -+ wake_up(&sbi->s_delete_thread_queue); -+ wait_event(sbi->s_delete_waiter_queue, list_empty(&sbi->s_delete_list)); -+} -+ -+/* Instead of playing games with the inode flags, destruction, etc we just -+ * duplicate the inode data locally and put it on a list for the truncate -+ * thread. We need large parts of the inode struct in order to complete -+ * the truncate and unlink, so we may as well just copy the whole thing. -+ * -+ * If we have any problem deferring the delete, just delete it right away. -+ * If we defer it, we also mark how many blocks it would free, so that we -+ * can keep the statfs data correct, and we know if we should sleep on the -+ * truncate thread when we run out of space. -+ * -+ * One shouldn't consider this duplicate an "inode", as it isn't really -+ * visible to the VFS, but rather a data struct that holds truncate data. -+ * -+ * In 2.5 this can be done much more cleanly by just registering a "drop" -+ * method in the super_operations struct. -+ */ -+static void ext3_delete_inode_thread(struct inode *old_inode) -+{ -+ struct ext3_sb_info *sbi = EXT3_SB(old_inode->i_sb); -+ struct inode *new_inode; -+ unsigned long blocks = old_inode->i_blocks >> (old_inode->i_blkbits-9); -+ -+ if (is_bad_inode(old_inode)) { -+ clear_inode(old_inode); -+ return; -+ } -+ -+ /* We may want to delete the inode immediately and not defer it */ -+ if (IS_SYNC(old_inode) || blocks <= EXT3_NDIR_BLOCKS || -+ !sbi->s_delete_list.next) { -+ ext3_delete_inode(old_inode); -+ return; -+ } -+ -+ if (EXT3_I(old_inode)->i_state & EXT3_STATE_DELETE) { -+ ext3_debug("doing deferred inode %lu delete (%lu blocks)\n", -+ old_inode->i_ino, blocks); -+ ext3_delete_inode(old_inode); -+ return; -+ } -+ -+ /* We can iget this inode again here, because our caller has unhashed -+ * old_inode, so new_inode will be in a different inode struct. -+ * -+ * We need to ensure that the i_orphan pointers in the other inodes -+ * point at the new inode copy instead of the old one so the orphan -+ * list doesn't get corrupted when the old orphan inode is freed. -+ */ -+ down(&sbi->s_orphan_lock); -+ -+ EXT3_SB(old_inode->i_sb)->s_mount_state |= EXT3_ORPHAN_FS; -+ new_inode = iget(old_inode->i_sb, old_inode->i_ino); -+ EXT3_SB(old_inode->i_sb)->s_mount_state &= ~EXT3_ORPHAN_FS; -+ if (is_bad_inode(new_inode)) { -+ printk(KERN_WARNING "read bad inode %lu\n", old_inode->i_ino); -+ iput(new_inode); -+ new_inode = NULL; -+ } -+ if (!new_inode) { -+ up(&sbi->s_orphan_lock); -+ ext3_debug(KERN_DEBUG "delete inode %lu directly (bad read)\n", -+ old_inode->i_ino); -+ ext3_delete_inode(old_inode); -+ return; -+ } -+ J_ASSERT(new_inode != old_inode); -+ -+ J_ASSERT(!list_empty(&EXT3_I(old_inode)->i_orphan)); -+ /* Ugh. We need to insert new_inode into the same spot on the list -+ * as old_inode was, to ensure the in-memory orphan list is still -+ * the same as the on-disk orphan list. -+ */ -+ EXT3_I(new_inode)->i_orphan = EXT3_I(old_inode)->i_orphan; -+ EXT3_I(new_inode)->i_orphan.next->prev = &EXT3_I(new_inode)->i_orphan; -+ EXT3_I(new_inode)->i_orphan.prev->next = &EXT3_I(new_inode)->i_orphan; -+ EXT3_I(new_inode)->i_state |= EXT3_STATE_DELETE; -+ up(&sbi->s_orphan_lock); -+ -+ clear_inode(old_inode); -+ -+ printk(KERN_DEBUG "delete inode %lu (%lu blocks) by thread\n", -+ new_inode->i_ino, blocks); -+ spin_lock(&sbi->s_delete_lock); -+ J_ASSERT(list_empty(&new_inode->i_dentry)); -+ list_add_tail(&new_inode->i_dentry, &sbi->s_delete_list); -+ sbi->s_delete_blocks += blocks; -+ sbi->s_delete_inodes++; -+ spin_unlock(&sbi->s_delete_lock); -+ -+ wake_up(&sbi->s_delete_thread_queue); -+} -+#else -+#define ext3_start_delete_thread(sbi) do {} while(0) -+#define ext3_stop_delete_thread(sbi) do {} while(0) -+#endif /* EXT3_DELETE_THREAD */ -+ - void ext3_put_super (struct super_block * sb) - { - struct ext3_sb_info *sbi = EXT3_SB(sb); -@@ -405,6 +606,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_stop_delete_thread(sbi); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -453,7 +655,11 @@ static struct super_operations ext3_sops - write_inode: ext3_write_inode, /* BKL not held. Don't need */ - dirty_inode: ext3_dirty_inode, /* BKL not held. We take it */ - put_inode: ext3_put_inode, /* BKL not held. Don't need */ -+#ifdef EXT3_DELETE_THREAD -+ delete_inode: ext3_delete_inode_thread,/* BKL not held. We take it */ -+#else - delete_inode: ext3_delete_inode, /* BKL not held. We take it */ -+#endif - put_super: ext3_put_super, /* BKL held */ - write_super: ext3_write_super, /* BKL held */ - sync_fs: ext3_sync_fs, -@@ -1209,6 +1415,7 @@ struct super_block * ext3_read_super (st - } - - ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY); -+ ext3_start_delete_thread(sb); - /* - * akpm: core read_super() calls in here with the superblock locked. - * That deadlocks, because orphan cleanup needs to lock the superblock - -_ diff --git a/lustre/kernel_patches/patches/extN-iget-debug.patch b/lustre/kernel_patches/patches/extN-iget-debug.patch deleted file mode 100644 index dbe90c867b..0000000000 --- a/lustre/kernel_patches/patches/extN-iget-debug.patch +++ /dev/null @@ -1,48 +0,0 @@ ---- linux/fs/ext3/namei.c.orig Thu Jan 30 01:15:13 2003 -+++ linux/fs/ext3/namei.c Sat Feb 1 00:33:46 2003 -@@ -710,6 +710,24 @@ - return ret; - } - -+static int ext3_find_inode(struct inode *inode, unsigned long ino, -+ void *opaque) -+{ -+ const char *name = NULL; -+ int len = 0; -+ -+ if (opaque) { -+ struct dentry *dentry = opaque; -+ name = dentry->d_name.name; -+ len = dentry->d_name.len; -+ } -+ printk(KERN_INFO "finding inode %s:%lu (%p) count %d (%p = %*s)\n", -+ kdevname(inode->i_dev), ino, inode, atomic_read(&inode->i_count), -+ opaque, len, name ? name : ""); -+ -+ return 1; -+} -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -724,8 +742,8 @@ - if (bh) { - unsigned long ino = le32_to_cpu(de->inode); - brelse (bh); -- inode = iget(dir->i_sb, ino); -+ inode = iget4(dir->i_sb, ino, ext3_find_inode, dentry); - - if (!inode) - return ERR_PTR(-EACCES); ---- linux/fs/ext3/inode.c.orig Thu Jan 30 01:15:13 2003 -+++ linux/fs/ext3/inode.c Sat Feb 1 00:34:45 2003 -@@ -166,6 +166,9 @@ - */ - void ext3_put_inode (struct inode * inode) - { -+ printk(KERN_INFO "putting inode %s:%lu (%p) count %d\n", -+ kdevname(inode->i_dev), inode->i_ino, inode, -+ atomic_read(&inode->i_count)); - ext3_discard_prealloc (inode); - } - diff --git a/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch b/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch new file mode 100644 index 0000000000..95213baade --- /dev/null +++ b/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch @@ -0,0 +1,11 @@ +--- kernel-2.4.20-6chaos_18_7/include/linux/module.h~gpl-header Wed Jul 16 03:54:37 2003 ++++ kernel-2.4.20-6chaos_18_7/include/linux/module.h Wed Jul 16 03:55:45 2003 +@@ -288,7 +288,7 @@ + "license=" license + + #define GPL_HEADER() \ +-static const char cpyright="This software may be freely redistributed under the terms of the GNU General Public License."; ++static const char cpyright[]="This software may be freely redistributed under the terms of the GNU General Public License."; + + /* Define the module variable, and usage macros. */ + extern struct module __this_module; diff --git a/lustre/kernel_patches/patches/inode-protection-from-pdflush.patch b/lustre/kernel_patches/patches/inode-protection-from-pdflush.patch new file mode 100644 index 0000000000..abfdc32c50 --- /dev/null +++ b/lustre/kernel_patches/patches/inode-protection-from-pdflush.patch @@ -0,0 +1,29 @@ + +diff -puN fs/fs-writeback.c~inode-protection-from-pdflush fs/fs-writeback.c +--- linux-2.5.73/fs/fs-writeback.c~inode-protection-from-pdflush Mon Jul 7 01:10:17 2003 ++++ linux-2.5.73-alexey/fs/fs-writeback.c Mon Jul 7 01:10:17 2003 +@@ -198,6 +198,11 @@ static void + __writeback_single_inode(struct inode *inode, + struct writeback_control *wbc) + { ++ if (inode->i_flags & I_SKIP_PDFLUSH) { ++ list_move(&inode->i_list, &inode->i_sb->s_dirty); ++ return; ++ } ++ + if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_LOCK)) { + list_move(&inode->i_list, &inode->i_sb->s_dirty); + return; +diff -puN include/linux/fs.h~inode-protection-from-pdflush include/linux/fs.h +--- linux-2.5.73/include/linux/fs.h~inode-protection-from-pdflush Mon Jul 7 01:22:16 2003 ++++ linux-2.5.73-alexey/include/linux/fs.h Mon Jul 7 01:23:18 2003 +@@ -816,6 +816,7 @@ struct super_operations { + #define I_FREEING 16 + #define I_CLEAR 32 + #define I_NEW 64 ++#define I_SKIP_PDFLUSH 1024 /* inode will be out of pdflush's scope */ + + #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) + + +_ diff --git a/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch b/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch new file mode 100644 index 0000000000..7c98c45625 --- /dev/null +++ b/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch @@ -0,0 +1,112 @@ + fs/inode.c | 21 ++++++++++++++------- + fs/smbfs/inode.c | 2 +- + fs/super.c | 4 ++-- + include/linux/fs.h | 2 +- + 4 files changed, 18 insertions(+), 11 deletions(-) + +--- kernel-2.4.20-6chaos_18_7/fs/inode.c~invalidate_show_2.4.20_chaos 2003-05-15 21:14:25.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/fs/inode.c 2003-07-12 15:33:08.000000000 -0600 +@@ -604,7 +604,8 @@ static void dispose_list(struct list_hea + /* + * Invalidate all inodes for a device. + */ +-static int invalidate_list(struct list_head *head, struct super_block * sb, struct list_head * dispose) ++static int invalidate_list(struct list_head *head, struct super_block * sb, ++ struct list_head * dispose, int show) + { + struct list_head *next; + int busy = 0, count = 0; +@@ -629,6 +630,11 @@ static int invalidate_list(struct list_h + count++; + continue; + } ++ if (show) ++ printk(KERN_ERR ++ "inode busy: dev %s:%lu (%p) mode %o count %u\n", ++ kdevname(sb->s_dev), inode->i_ino, inode, ++ inode->i_mode, atomic_read(&inode->i_count)); + busy = 1; + } + /* only unused inodes may be cached with i_count zero */ +@@ -647,22 +653,23 @@ static int invalidate_list(struct list_h + /** + * invalidate_inodes - discard the inodes on a device + * @sb: superblock ++ * @show: whether we should display any busy inodes found + * + * Discard all of the inodes for a given superblock. If the discard + * fails because there are busy inodes then a non zero value is returned. + * If the discard is successful all the inodes have been discarded. + */ + +-int invalidate_inodes(struct super_block * sb) ++int invalidate_inodes(struct super_block * sb, int show) + { + int busy; + LIST_HEAD(throw_away); + + spin_lock(&inode_lock); +- busy = invalidate_list(&inode_in_use, sb, &throw_away); +- busy |= invalidate_list(&inode_unused, sb, &throw_away); +- busy |= invalidate_list(&sb->s_dirty, sb, &throw_away); +- busy |= invalidate_list(&sb->s_locked_inodes, sb, &throw_away); ++ busy = invalidate_list(&inode_in_use, sb, &throw_away, show); ++ busy |= invalidate_list(&inode_unused, sb, &throw_away, show); ++ busy |= invalidate_list(&sb->s_dirty, sb, &throw_away, show); ++ busy |= invalidate_list(&sb->s_locked_inodes, sb, &throw_away, show); + spin_unlock(&inode_lock); + + dispose_list(&throw_away); +@@ -688,7 +695,7 @@ int invalidate_device(kdev_t dev, int do + * hold). + */ + shrink_dcache_sb(sb); +- res = invalidate_inodes(sb); ++ res = invalidate_inodes(sb, 0); + drop_super(sb); + } + invalidate_buffers(dev); +--- kernel-2.4.20-6chaos_18_7/fs/super.c~invalidate_show_2.4.20_chaos 2003-05-15 21:14:25.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/fs/super.c 2003-07-12 15:31:35.000000000 -0600 +@@ -943,7 +943,7 @@ void kill_super(struct super_block *sb) + lock_super(sb); + lock_kernel(); + sb->s_flags &= ~MS_ACTIVE; +- invalidate_inodes(sb); /* bad name - it should be evict_inodes() */ ++ invalidate_inodes(sb, 0); /* bad name - it should be evict_inodes() */ + if (sop) { + if (sop->write_super && sb->s_dirt) + sop->write_super(sb); +@@ -952,7 +952,7 @@ void kill_super(struct super_block *sb) + } + + /* Forget any remaining inodes */ +- if (invalidate_inodes(sb)) { ++ if (invalidate_inodes(sb, 1)) { + printk(KERN_ERR "VFS: Busy inodes after unmount. " + "Self-destruct in 5 seconds. Have a nice day...\n"); + } +--- kernel-2.4.20-6chaos_18_7/include/linux/fs.h~invalidate_show_2.4.20_chaos 2003-07-12 15:14:02.000000000 -0600 ++++ kernel-2.4.20-6chaos_18_7-braam/include/linux/fs.h 2003-07-12 15:31:35.000000000 -0600 +@@ -1284,7 +1284,7 @@ static inline void mark_buffer_dirty_ino + extern void set_buffer_flushtime(struct buffer_head *); + extern void balance_dirty(void); + extern int check_disk_change(kdev_t); +-extern int invalidate_inodes(struct super_block *); ++extern int invalidate_inodes(struct super_block *, int); + extern int invalidate_device(kdev_t, int); + extern void invalidate_inode_pages(struct inode *); + extern void invalidate_inode_pages2(struct address_space *); +--- kernel-2.4.20-6chaos_18_7/fs/smbfs/inode.c~invalidate_show_2.4.20_chaos 2003-02-14 15:59:13.000000000 -0700 ++++ kernel-2.4.20-6chaos_18_7-braam/fs/smbfs/inode.c 2003-07-12 15:31:35.000000000 -0600 +@@ -167,7 +167,7 @@ smb_invalidate_inodes(struct smb_sb_info + { + VERBOSE("\n"); + shrink_dcache_sb(SB_of(server)); +- invalidate_inodes(SB_of(server)); ++ invalidate_inodes(SB_of(server), 0); + } + + /* + +_ diff --git a/lustre/kernel_patches/patches/iopen-2.5.73.patch b/lustre/kernel_patches/patches/iopen-2.5.73.patch new file mode 100644 index 0000000000..c9d422372b --- /dev/null +++ b/lustre/kernel_patches/patches/iopen-2.5.73.patch @@ -0,0 +1,403 @@ + Documentation/filesystems/ext2.txt | 16 ++ + fs/ext3/Makefile | 2 + fs/ext3/inode.c | 3 + fs/ext3/iopen.c | 239 +++++++++++++++++++++++++++++++++++++ + fs/ext3/iopen.h | 15 ++ + fs/ext3/namei.c | 13 ++ + fs/ext3/super.c | 11 + + include/linux/ext3_fs.h | 2 + 8 files changed, 300 insertions(+), 1 deletion(-) + +--- linux-2.6.0-test1/Documentation/filesystems/ext2.txt~iopen-2.5.73 2003-07-13 21:31:56.000000000 -0600 ++++ linux-2.6.0-test1-braam/Documentation/filesystems/ext2.txt 2003-07-22 01:15:46.000000000 -0600 +@@ -35,6 +35,22 @@ resgid=n The group ID which may use th + + sb=n Use alternate superblock at this location. + ++iopen Makes an invisible pseudo-directory called ++ __iopen__ available in the root directory ++ of the filesystem. Allows open-by-inode- ++ number. i.e., inode 3145 can be accessed ++ via /mntpt/__iopen__/3145 ++ ++iopen_nopriv This option makes the iopen directory be ++ world-readable. This may be safer since it ++ allows daemons to run as an unprivileged user, ++ however it significantly changes the security ++ model of a Unix filesystem, since previously ++ all files under a mode 700 directory were not ++ generally avilable even if the ++ permissions on the file itself is ++ world-readable. ++ + grpquota,noquota,quota,usrquota Quota options are silently ignored by ext2. + + +--- linux-2.6.0-test1/fs/ext3/Makefile~iopen-2.5.73 2003-07-13 21:30:37.000000000 -0600 ++++ linux-2.6.0-test1-braam/fs/ext3/Makefile 2003-07-22 01:15:46.000000000 -0600 +@@ -5,7 +5,7 @@ + obj-$(CONFIG_EXT3_FS) += ext3.o + + ext3-objs := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ +- ioctl.o namei.o super.o symlink.o hash.o ++ iopen.o ioctl.o namei.o super.o symlink.o hash.o + + ifeq ($(CONFIG_EXT3_FS_XATTR),y) + ext3-objs += xattr.o xattr_user.o xattr_trusted.o +--- linux-2.6.0-test1/fs/ext3/inode.c~iopen-2.5.73 2003-07-22 01:15:25.000000000 -0600 ++++ linux-2.6.0-test1-braam/fs/ext3/inode.c 2003-07-22 01:16:19.000000000 -0600 +@@ -37,6 +37,7 @@ + #include <linux/mpage.h> + #include <linux/uio.h> + #include "xattr.h" ++#include "iopen.h" + #include "acl.h" + + /* +@@ -2478,6 +2479,8 @@ 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_iopen_get_inode(inode)) ++ return; + if (ext3_get_inode_loc(inode, &iloc, 0)) + goto bad_inode; + bh = iloc.bh; +--- /dev/null 2003-01-30 03:24:37.000000000 -0700 ++++ linux-2.6.0-test1-braam/fs/ext3/iopen.c 2003-07-22 01:15:46.000000000 -0600 +@@ -0,0 +1,239 @@ ++ ++ ++/* ++ * linux/fs/ext3/iopen.c ++ * ++ * Special support for open by inode number ++ * ++ * Copyright (C) 2001 by Theodore Ts'o (tytso@alum.mit.edu). ++ * ++ * This file may be redistributed under the terms of the GNU General ++ * Public License. ++ */ ++ ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/ext3_jbd.h> ++#include <linux/jbd.h> ++#include <linux/ext3_fs.h> ++#include <linux/smp_lock.h> ++#include "iopen.h" ++ ++#ifndef assert ++#define assert(test) J_ASSERT(test) ++#endif ++ ++#define IOPEN_NAME_LEN 32 ++ ++/* ++ * This implements looking up an inode by number. ++ */ ++static struct dentry *iopen_lookup(struct inode * dir, struct dentry *dentry) ++{ ++ struct inode * inode; ++ unsigned long ino; ++ struct list_head *lp; ++ struct dentry *alternate; ++ char buf[IOPEN_NAME_LEN]; ++ ++ if (dentry->d_name.len >= IOPEN_NAME_LEN) ++ return ERR_PTR(-ENAMETOOLONG); ++ ++ memcpy(buf, dentry->d_name.name, dentry->d_name.len); ++ buf[dentry->d_name.len] = 0; ++ ++ if (strcmp(buf, ".") == 0) ++ ino = dir->i_ino; ++ else if (strcmp(buf, "..") == 0) ++ ino = EXT3_ROOT_INO; ++ else ++ ino = simple_strtoul(buf, 0, 0); ++ ++ if ((ino != EXT3_ROOT_INO && ++ //ino != EXT3_ACL_IDX_INO && ++ //ino != EXT3_ACL_DATA_INO && ++ ino < EXT3_FIRST_INO(dir->i_sb)) || ++ ino > le32_to_cpu(EXT3_SB(dir->i_sb)->s_es->s_inodes_count)) ++ return ERR_PTR(-ENOENT); ++ ++ inode = iget(dir->i_sb, ino); ++ if (!inode) ++ return ERR_PTR(-EACCES); ++ if (is_bad_inode(inode)) { ++ iput(inode); ++ return ERR_PTR(-ENOENT); ++ } ++ ++ /* preferrably return a connected dentry */ ++ spin_lock(&dcache_lock); ++ list_for_each(lp, &inode->i_dentry) { ++ alternate = list_entry(lp, struct dentry, d_alias); ++ assert(!(alternate->d_flags & DCACHE_DISCONNECTED)); ++ } ++ ++ if (!list_empty(&inode->i_dentry)) { ++ alternate = list_entry(inode->i_dentry.next, ++ struct dentry, d_alias); ++ dget_locked(alternate); ++ alternate->d_vfs_flags |= DCACHE_REFERENCED; ++ iput(inode); ++ spin_unlock(&dcache_lock); ++ return alternate; ++ } ++ dentry->d_flags |= DCACHE_DISCONNECTED; ++ spin_unlock(&dcache_lock); ++ ++ d_add(dentry, inode); ++ return NULL; ++} ++ ++#define do_switch(x,y) do { \ ++ __typeof__ (x) __tmp = x; \ ++ x = y; y = __tmp; } while (0) ++ ++static inline void switch_names(struct dentry * dentry, struct dentry * target) ++{ ++ const unsigned char *old_name, *new_name; ++ ++ memcpy(dentry->d_iname, target->d_iname, DNAME_INLINE_LEN); ++ old_name = target->d_name.name; ++ new_name = dentry->d_name.name; ++ if (old_name == target->d_iname) ++ old_name = dentry->d_iname; ++ if (new_name == dentry->d_iname) ++ new_name = target->d_iname; ++ target->d_name.name = new_name; ++ dentry->d_name.name = old_name; ++} ++ ++ ++struct dentry *iopen_connect_dentry(struct dentry *de, struct inode *inode) ++{ ++ struct dentry *tmp, *goal = NULL; ++ struct list_head *lp; ++ ++ /* preferrably return a connected dentry */ ++ spin_lock(&dcache_lock); ++ /* verify this dentry is really new */ ++ assert(!de->d_inode); ++ assert(list_empty(&de->d_subdirs)); ++ assert(list_empty(&de->d_alias)); ++ ++ ++ list_for_each(lp, &inode->i_dentry) { ++ tmp = list_entry(lp, struct dentry, d_alias); ++ if (tmp->d_flags & DCACHE_DISCONNECTED) { ++ assert(tmp->d_alias.next == &inode->i_dentry); ++ assert(tmp->d_alias.prev == &inode->i_dentry); ++ goal = tmp; ++ dget_locked(goal); ++ break; ++ } ++ } ++ ++ if (!goal) { ++ spin_unlock(&dcache_lock); ++ return NULL; ++ } ++ ++ /* Move the goal to the de hash queue */ ++ goal->d_flags &= ~DCACHE_DISCONNECTED; ++ hlist_add_before(&goal->d_hash, &de->d_hash); ++ hlist_del(&goal->d_hash); ++ ++ list_del(&goal->d_child); ++ list_del(&de->d_child); ++ ++ /* Switch the parents and the names.. */ ++ switch_names(goal, de); ++ do_switch(goal->d_parent, de->d_parent); ++ do_switch(goal->d_name.len, de->d_name.len); ++ do_switch(goal->d_name.hash, de->d_name.hash); ++ ++ /* And add them back to the (new) parent lists */ ++ list_add(&goal->d_child, &goal->d_parent->d_subdirs); ++ list_add(&de->d_child, &de->d_parent->d_subdirs); ++ ++ spin_unlock(&dcache_lock); ++ return goal; ++} ++ ++/* ++ * These are the special structures for the iopen pseudo directory. ++ */ ++ ++static struct inode_operations iopen_inode_operations = { ++ lookup: iopen_lookup, /* BKL held */ ++}; ++ ++static struct file_operations iopen_file_operations = { ++ read: generic_read_dir, ++}; ++ ++static int match_dentry(struct dentry *dentry, const char *name) ++{ ++ int len; ++ ++ len = strlen(name); ++ if (dentry->d_name.len != len) ++ return 0; ++ if (strncmp(dentry->d_name.name, name, len)) ++ return 0; ++ return 1; ++} ++ ++/* ++ * This function is spliced into ext3_lookup and returns 1 the file ++ * name is __iopen__ and dentry has been filled in appropriately. ++ */ ++int ext3_check_for_iopen(struct inode * dir, struct dentry *dentry) ++{ ++ struct inode * inode; ++ ++ if (dir->i_ino != EXT3_ROOT_INO || ++ !test_opt(dir->i_sb, IOPEN) || ++ !match_dentry(dentry, "__iopen__")) ++ return 0; ++ ++ inode = iget(dir->i_sb, EXT3_BAD_INO); ++ ++ if (!inode) ++ return 0; ++ d_add(dentry, inode); ++ return 1; ++} ++ ++/* ++ * This function is spliced into read_inode; it returns 1 if inode ++ * number is the one for /__iopen__, in which case the inode is filled ++ * in appropriately. Otherwise, this fuction returns 0. ++ */ ++int ext3_iopen_get_inode(struct inode * inode) ++{ ++ if (inode->i_ino != EXT3_BAD_INO) ++ return 0; ++ ++ inode->i_mode = S_IFDIR | S_IRUSR | S_IXUSR; ++ if (test_opt(inode->i_sb, IOPEN_NOPRIV)) ++ inode->i_mode |= 0777; ++ inode->i_uid = 0; ++ inode->i_gid = 0; ++ inode->i_nlink = 1; ++ inode->i_size = 4096; ++ inode->i_atime = CURRENT_TIME; ++ inode->i_ctime = CURRENT_TIME; ++ inode->i_mtime = CURRENT_TIME; ++ EXT3_I(inode)->i_dtime = 0; ++ inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size ++ * (for stat), not the fs block ++ * size */ ++ inode->i_blocks = 0; ++ inode->i_version = 1; ++ inode->i_generation = 0; ++ ++ inode->i_op = &iopen_inode_operations; ++ inode->i_fop = &iopen_file_operations; ++ inode->i_mapping->a_ops = 0; ++ ++ return 1; ++} +--- /dev/null 2003-01-30 03:24:37.000000000 -0700 ++++ linux-2.6.0-test1-braam/fs/ext3/iopen.h 2003-07-22 01:15:46.000000000 -0600 +@@ -0,0 +1,15 @@ ++/* ++ * iopen.h ++ * ++ * Special support for opening files by inode number. ++ * ++ * Copyright (C) 2001 by Theodore Ts'o (tytso@alum.mit.edu). ++ * ++ * This file may be redistributed under the terms of the GNU General ++ * Public License. ++ */ ++ ++extern int ext3_check_for_iopen(struct inode * dir, struct dentry *dentry); ++extern int ext3_iopen_get_inode(struct inode * inode); ++ ++ +--- linux-2.6.0-test1/fs/ext3/namei.c~iopen-2.5.73 2003-07-13 21:34:43.000000000 -0600 ++++ linux-2.6.0-test1-braam/fs/ext3/namei.c 2003-07-22 01:17:20.000000000 -0600 +@@ -37,6 +37,7 @@ + #include <linux/buffer_head.h> + #include <linux/smp_lock.h> + #include "xattr.h" ++#include "iopen.h" + #include "acl.h" + + /* +@@ -970,15 +971,21 @@ errout: + } + #endif + ++struct dentry *iopen_connect_dentry(struct dentry *de, struct inode *inode); ++ + static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd) + { + struct inode * inode; + struct ext3_dir_entry_2 * de; + struct buffer_head * bh; ++ struct dentry *alternate = NULL; + + if (dentry->d_name.len > EXT3_NAME_LEN) + return ERR_PTR(-ENAMETOOLONG); + ++ if (ext3_check_for_iopen(dir, dentry)) ++ return NULL; ++ + bh = ext3_find_entry(dentry, &de); + inode = NULL; + if (bh) { +@@ -991,6 +998,12 @@ static struct dentry *ext3_lookup(struct + } + if (inode) + return d_splice_alias(inode, dentry); ++ ++ if (inode && (alternate = iopen_connect_dentry(dentry, inode))) { ++ iput(inode); ++ return alternate; ++ } ++ + d_add(dentry, inode); + return NULL; + } +--- linux-2.6.0-test1/fs/ext3/super.c~iopen-2.5.73 2003-07-22 01:15:25.000000000 -0600 ++++ linux-2.6.0-test1-braam/fs/ext3/super.c 2003-07-22 01:15:46.000000000 -0600 +@@ -755,6 +755,17 @@ static int parse_options (char * options + || !strcmp (this_char, "quota") + || !strcmp (this_char, "usrquota")) + /* Don't do anything ;-) */ ; ++ else if (!strcmp (this_char, "iopen")) { ++ set_opt (sbi->s_mount_opt, IOPEN); ++ clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV); ++ } else if (!strcmp (this_char, "noiopen")) { ++ clear_opt (sbi->s_mount_opt, IOPEN); ++ clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV); ++ } ++ else if (!strcmp (this_char, "iopen_nopriv")) { ++ set_opt (sbi->s_mount_opt, IOPEN); ++ set_opt (sbi->s_mount_opt, IOPEN_NOPRIV); ++ } + else if (!strcmp (this_char, "journal")) { + /* @@@ FIXME */ + /* Eventually we will want to be able to create +--- linux-2.6.0-test1/include/linux/ext3_fs.h~iopen-2.5.73 2003-07-22 01:14:05.000000000 -0600 ++++ linux-2.6.0-test1-braam/include/linux/ext3_fs.h 2003-07-22 01:15:46.000000000 -0600 +@@ -324,6 +324,8 @@ struct ext3_inode { + #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ + #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ + #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ ++#define EXT3_MOUNT_IOPEN 0x10000 /* Allow access via iopen */ ++#define EXT3_MOUNT_IOPEN_NOPRIV 0x20000 /* Make iopen world-readable */ + + /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ + #ifndef _LINUX_EXT2_FS_H + +_ diff --git a/lustre/kernel_patches/patches/jbd-transno-cb.patch b/lustre/kernel_patches/patches/jbd-transno-cb.patch deleted file mode 100644 index ceb086dba7..0000000000 --- a/lustre/kernel_patches/patches/jbd-transno-cb.patch +++ /dev/null @@ -1,240 +0,0 @@ - - - - fs/jbd/commit.c | 27 +++++++++++++++++++++--- - fs/jbd/journal.c | 1 - fs/jbd/transaction.c | 56 ++++++++++++++++++++++++++++++++++++++++----------- - include/linux/jbd.h | 20 ++++++++++++++++++ - 4 files changed, 90 insertions(+), 14 deletions(-) - ---- linux-2.4.19/fs/jbd/commit.c~vanilla-2.4.19 Sun Jan 19 19:46:42 2003 -+++ linux-2.4.19-root/fs/jbd/commit.c Sun Jan 19 19:46:42 2003 -@@ -475,7 +475,7 @@ start_journal_io: - transaction's t_log_list queue, and metadata buffers are on - the t_iobuf_list queue. - -- Wait for the transactions in reverse order. That way we are -+ Wait for the buffers in reverse order. That way we are - less likely to be woken up until all IOs have completed, and - so we incur less scheduling load. - */ -@@ -566,8 +566,10 @@ start_journal_io: - - jbd_debug(3, "JBD: commit phase 6\n"); - -- if (is_journal_aborted(journal)) -+ if (is_journal_aborted(journal)) { -+ unlock_journal(journal); - goto skip_commit; -+ } - - /* Done it all: now write the commit record. We should have - * cleaned up our previous buffers by now, so if we are in abort -@@ -577,6 +579,7 @@ start_journal_io: - descriptor = journal_get_descriptor_buffer(journal); - if (!descriptor) { - __journal_abort_hard(journal); -+ unlock_journal(journal); - goto skip_commit; - } - -@@ -600,7 +603,6 @@ start_journal_io: - put_bh(bh); /* One for getblk() */ - journal_unlock_journal_head(descriptor); - } -- lock_journal(journal); - - /* End of a transaction! Finally, we can do checkpoint - processing: any buffers committed as a result of this -@@ -609,6 +611,25 @@ start_journal_io: - - skip_commit: - -+ /* Call any callbacks that had been registered for handles in this -+ * transaction. It is up to the callback to free any allocated -+ * memory. -+ */ -+ if (!list_empty(&commit_transaction->t_jcb)) { -+ struct list_head *p, *n; -+ int error = is_journal_aborted(journal); -+ -+ list_for_each_safe(p, n, &commit_transaction->t_jcb) { -+ struct journal_callback *jcb; -+ -+ jcb = list_entry(p, struct journal_callback, jcb_list); -+ list_del(p); -+ jcb->jcb_func(jcb, error); -+ } -+ } -+ -+ lock_journal(journal); -+ - jbd_debug(3, "JBD: commit phase 7\n"); - - J_ASSERT(commit_transaction->t_sync_datalist == NULL); ---- linux-2.4.19/fs/jbd/journal.c~vanilla-2.4.19 Sun Jan 19 19:46:42 2003 -+++ linux-2.4.19-root/fs/jbd/journal.c Sun Jan 19 19:46:42 2003 -@@ -58,6 +58,7 @@ EXPORT_SYMBOL(journal_sync_buffer); - #endif - EXPORT_SYMBOL(journal_flush); - EXPORT_SYMBOL(journal_revoke); -+EXPORT_SYMBOL(journal_callback_set); - - EXPORT_SYMBOL(journal_init_dev); - EXPORT_SYMBOL(journal_init_inode); ---- linux-2.4.19/fs/jbd/transaction.c~vanilla-2.4.19 Sun Jan 19 19:46:42 2003 -+++ linux-2.4.19-root/fs/jbd/transaction.c Sun Jan 19 19:46:42 2003 -@@ -57,6 +57,7 @@ static transaction_t * get_transaction ( - transaction->t_state = T_RUNNING; - transaction->t_tid = journal->j_transaction_sequence++; - transaction->t_expires = jiffies + journal->j_commit_interval; -+ INIT_LIST_HEAD(&transaction->t_jcb); - - /* Set up the commit timer for the new transaction. */ - J_ASSERT (!journal->j_commit_timer_active); -@@ -201,6 +202,20 @@ repeat_locked: - return 0; - } - -+/* Allocate a new handle. This should probably be in a slab... */ -+static handle_t *new_handle(int nblocks) -+{ -+ handle_t *handle = jbd_kmalloc(sizeof (handle_t), GFP_NOFS); -+ if (!handle) -+ return NULL; -+ memset(handle, 0, sizeof (handle_t)); -+ handle->h_buffer_credits = nblocks; -+ handle->h_ref = 1; -+ INIT_LIST_HEAD(&handle->h_jcb); -+ -+ return handle; -+} -+ - /* - * Obtain a new handle. - * -@@ -227,14 +242,11 @@ handle_t *journal_start(journal_t *journ - handle->h_ref++; - return handle; - } -- -- handle = jbd_kmalloc(sizeof (handle_t), GFP_NOFS); -+ -+ handle = new_handle(nblocks); - if (!handle) - return ERR_PTR(-ENOMEM); -- memset (handle, 0, sizeof (handle_t)); - -- handle->h_buffer_credits = nblocks; -- handle->h_ref = 1; - current->journal_info = handle; - - err = start_this_handle(journal, handle); -@@ -333,14 +345,11 @@ handle_t *journal_try_start(journal_t *j - - if (is_journal_aborted(journal)) - return ERR_PTR(-EIO); -- -- handle = jbd_kmalloc(sizeof (handle_t), GFP_NOFS); -+ -+ handle = new_handle(nblocks); - if (!handle) - return ERR_PTR(-ENOMEM); -- memset (handle, 0, sizeof (handle_t)); - -- handle->h_buffer_credits = nblocks; -- handle->h_ref = 1; - current->journal_info = handle; - - err = try_start_this_handle(journal, handle); -@@ -1328,6 +1337,28 @@ out: - #endif - - /* -+ * Register a callback function for this handle. The function will be -+ * called when the transaction that this handle is part of has been -+ * committed to disk with the original callback data struct and the -+ * error status of the journal as parameters. There is no guarantee of -+ * ordering between handles within a single transaction, nor between -+ * callbacks registered on the same handle. -+ * -+ * The caller is responsible for allocating the journal_callback struct. -+ * This is to allow the caller to add as much extra data to the callback -+ * as needed, but reduce the overhead of multiple allocations. The caller -+ * allocated struct must start with a struct journal_callback at offset 0, -+ * and has the caller-specific data afterwards. -+ */ -+void journal_callback_set(handle_t *handle, -+ void (*func)(struct journal_callback *jcb, int error), -+ struct journal_callback *jcb) -+{ -+ list_add(&jcb->jcb_list, &handle->h_jcb); -+ jcb->jcb_func = func; -+} -+ -+/* - * All done for a particular handle. - * - * There is not much action needed here. We just return any remaining -@@ -1393,7 +1424,10 @@ int journal_stop(handle_t *handle) - wake_up(&journal->j_wait_transaction_locked); - } - -- /* -+ /* Move callbacks from the handle to the transaction. */ -+ list_splice(&handle->h_jcb, &transaction->t_jcb); -+ -+ /* - * If the handle is marked SYNC, we need to set another commit - * going! We also want to force a commit if the current - * transaction is occupying too much of the log, or if the ---- linux-2.4.19/include/linux/jbd.h~vanilla-2.4.19 Sun Jan 19 19:46:42 2003 -+++ linux-2.4.19-root/include/linux/jbd.h Sun Jan 19 19:46:42 2003 -@@ -249,6 +249,13 @@ static inline struct journal_head *bh2jh - return bh->b_private; - } - -+#define HAVE_JOURNAL_CALLBACK_STATUS -+struct journal_callback { -+ struct list_head jcb_list; -+ void (*jcb_func)(struct journal_callback *jcb, int error); -+ /* user data goes here */ -+}; -+ - struct jbd_revoke_table_s; - - /* The handle_t type represents a single atomic update being performed -@@ -279,6 +286,12 @@ struct handle_s - operations */ - int h_err; - -+ /* List of application registered callbacks for this handle. -+ * The function(s) will be called after the transaction that -+ * this handle is part of has been committed to disk. -+ */ -+ struct list_head h_jcb; -+ - /* Flags */ - unsigned int h_sync: 1; /* sync-on-close */ - unsigned int h_jdata: 1; /* force data journaling */ -@@ -398,6 +411,10 @@ struct transaction_s - - /* How many handles used this transaction? */ - int t_handle_count; -+ -+ /* List of registered callback functions for this transaction. -+ * Called when the transaction is committed. */ -+ struct list_head t_jcb; - }; - - -@@ -646,6 +663,9 @@ extern int journal_flushpage(journal_t - extern int journal_try_to_free_buffers(journal_t *, struct page *, int); - extern int journal_stop(handle_t *); - extern int journal_flush (journal_t *); -+extern void journal_callback_set(handle_t *handle, -+ void (*fn)(struct journal_callback *,int), -+ struct journal_callback *jcb); - - extern void journal_lock_updates (journal_t *); - extern void journal_unlock_updates (journal_t *); diff --git a/lustre/kernel_patches/patches/kexec-2.5.73-full.patch b/lustre/kernel_patches/patches/kexec-2.5.73-full.patch new file mode 100644 index 0000000000..3f45a0678c --- /dev/null +++ b/lustre/kernel_patches/patches/kexec-2.5.73-full.patch @@ -0,0 +1,1479 @@ +# This is a BitKeeper generated patch for the following project: +# Project Name: Linux kernel tree +# This patch format is intended for GNU patch command version 2.5 or higher. +# This patch includes the following deltas: +# ChangeSet 1.1376 -> 1.1380 +# arch/i386/kernel/smp.c 1.32 -> 1.33 +# kernel/sys.c 1.47 -> 1.48 +# arch/i386/Kconfig 1.62 -> 1.63 +# arch/i386/kernel/Makefile 1.44 -> 1.45 +# kernel/Makefile 1.28 -> 1.29 +# arch/i386/kernel/entry.S 1.64 -> 1.65 +# arch/i386/kernel/reboot.c 1.8 -> 1.9 +# arch/i386/kernel/io_apic.c 1.71 -> 1.72 +# arch/i386/kernel/dmi_scan.c 1.36 -> 1.37 +# fs/aio.c 1.32 -> 1.33 +# include/asm-i386/apicdef.h 1.8 -> 1.9 +# MAINTAINERS 1.149 -> 1.150 +# include/asm-i386/unistd.h 1.26 -> 1.27 +# arch/i386/defconfig 1.96 -> 1.97 +# arch/i386/kernel/i8259.c 1.25 -> 1.26 +# include/asm-i386/apic.h 1.13 -> 1.14 +# arch/i386/kernel/apic.c 1.42 -> 1.43 +# include/linux/reboot.h 1.4 -> 1.5 +# (new) -> 1.1 include/linux/kexec.h +# (new) -> 1.1 include/asm-i386/kexec.h +# (new) -> 1.1 kernel/kexec.c +# (new) -> 1.1 arch/i386/kernel/relocate_kernel.S +# (new) -> 1.1 arch/i386/kernel/machine_kexec.c +# +# The following is the BitKeeper ChangeSet Log +# -------------------------------------------- +# 03/06/23 andyp@andyp.pdx.osdl.net 1.1377 +# kexec2-2.5.73-common.patch +# -------------------------------------------- +# 03/06/23 andyp@andyp.pdx.osdl.net 1.1378 +# kexec2-2.5.73-x86.patch +# -------------------------------------------- +# 03/06/23 andyp@andyp.pdx.osdl.net 1.1379 +# kexec2-2.5.73-syscall.patch +# -------------------------------------------- +# 03/06/23 andyp@andyp.pdx.osdl.net 1.1380 +# kexec2-2.5.73-defconfig.patch +# -------------------------------------------- +# +diff -Nru a/MAINTAINERS b/MAINTAINERS +--- a/MAINTAINERS Mon Jun 23 12:22:26 2003 ++++ b/MAINTAINERS Mon Jun 23 12:22:26 2003 +@@ -1067,6 +1067,17 @@ + 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 +diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig +--- a/arch/i386/Kconfig Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/Kconfig Mon Jun 23 12:22:26 2003 +@@ -794,6 +794,23 @@ + 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 + + +diff -Nru a/arch/i386/defconfig b/arch/i386/defconfig +--- a/arch/i386/defconfig Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/defconfig Mon Jun 23 12:22:26 2003 +@@ -72,6 +72,7 @@ + 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 +diff -Nru a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile +--- a/arch/i386/kernel/Makefile Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/Makefile Mon Jun 23 12:22:26 2003 +@@ -24,6 +24,7 @@ + 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 +diff -Nru a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c +--- a/arch/i386/kernel/apic.c Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/apic.c Mon Jun 23 12:22:26 2003 +@@ -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 @@ + 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) +@@ -1113,6 +1147,26 @@ + printk (KERN_INFO "APIC error on CPU%d: %02lx(%02lx)\n", + smp_processor_id(), v , v1); + 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(); + } + + /* +diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c +--- a/arch/i386/kernel/dmi_scan.c Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/dmi_scan.c Mon Jun 23 12:22:26 2003 +@@ -222,31 +222,6 @@ + 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 @@ + 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 +diff -Nru a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S +--- a/arch/i386/kernel/entry.S Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/entry.S Mon Jun 23 12:22:26 2003 +@@ -876,5 +876,6 @@ + .long sys_clock_nanosleep + .long sys_statfs64 + .long sys_fstatfs64 ++ .long sys_kexec_load /* 270 */ + + nr_syscalls=(.-sys_call_table)/4 +diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c +--- a/arch/i386/kernel/i8259.c Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/i8259.c Mon Jun 23 12:22:26 2003 +@@ -244,9 +244,21 @@ + 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 = { +diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c +--- a/arch/i386/kernel/io_apic.c Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/io_apic.c Mon Jun 23 12:22:26 2003 +@@ -1562,8 +1562,6 @@ + * Clear the IO-APIC before rebooting: + */ + clear_IO_APIC(); +- +- disconnect_bsp_APIC(); + } + + /* +diff -Nru a/arch/i386/kernel/machine_kexec.c b/arch/i386/kernel/machine_kexec.c +--- /dev/null Wed Dec 31 16:00:00 1969 ++++ b/arch/i386/kernel/machine_kexec.c Mon Jun 23 12:22:26 2003 +@@ -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); ++} +diff -Nru a/arch/i386/kernel/reboot.c b/arch/i386/kernel/reboot.c +--- a/arch/i386/kernel/reboot.c Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/reboot.c Mon Jun 23 12:22:26 2003 +@@ -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 @@ + 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 @@ + 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_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)) || +- !(phys_cpu_present_map & (1<<cpuid))) +- 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_halt(void) + { ++ stop_apics(); + } + + void machine_power_off(void) + { ++ stop_apics(); + if (pm_power_off) + pm_power_off(); + } +diff -Nru a/arch/i386/kernel/relocate_kernel.S b/arch/i386/kernel/relocate_kernel.S +--- /dev/null Wed Dec 31 16:00:00 1969 ++++ b/arch/i386/kernel/relocate_kernel.S Mon Jun 23 12:22:26 2003 +@@ -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 +diff -Nru a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c +--- a/arch/i386/kernel/smp.c Mon Jun 23 12:22:26 2003 ++++ b/arch/i386/kernel/smp.c Mon Jun 23 12:22:26 2003 +@@ -547,6 +547,30 @@ + + 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(); +diff -Nru a/fs/aio.c b/fs/aio.c +--- a/fs/aio.c Mon Jun 23 12:22:26 2003 ++++ b/fs/aio.c Mon Jun 23 12:22:26 2003 +@@ -536,7 +536,7 @@ + return ioctx; + } + +-static void use_mm(struct mm_struct *mm) ++void use_mm(struct mm_struct *mm) + { + struct mm_struct *active_mm = current->active_mm; + atomic_inc(&mm->mm_count); +diff -Nru a/include/asm-i386/apic.h b/include/asm-i386/apic.h +--- a/include/asm-i386/apic.h Mon Jun 23 12:22:26 2003 ++++ b/include/asm-i386/apic.h Mon Jun 23 12:22:26 2003 +@@ -97,6 +97,9 @@ + #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 */ +diff -Nru a/include/asm-i386/apicdef.h b/include/asm-i386/apicdef.h +--- a/include/asm-i386/apicdef.h Mon Jun 23 12:22:26 2003 ++++ b/include/asm-i386/apicdef.h Mon Jun 23 12:22:26 2003 +@@ -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 +diff -Nru a/include/asm-i386/kexec.h b/include/asm-i386/kexec.h +--- /dev/null Wed Dec 31 16:00:00 1969 ++++ b/include/asm-i386/kexec.h Mon Jun 23 12:22:26 2003 +@@ -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 */ +diff -Nru a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h +--- a/include/asm-i386/unistd.h Mon Jun 23 12:22:26 2003 ++++ b/include/asm-i386/unistd.h Mon Jun 23 12:22:26 2003 +@@ -275,8 +275,9 @@ + #define __NR_clock_nanosleep (__NR_timer_create+8) + #define __NR_statfs64 268 + #define __NR_fstatfs64 269 ++#define __NR_sys_kexec_load 270 + +-#define NR_syscalls 270 ++#define NR_syscalls 271 + + /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */ + +diff -Nru a/include/linux/kexec.h b/include/linux/kexec.h +--- /dev/null Wed Dec 31 16:00:00 1969 ++++ b/include/linux/kexec.h Mon Jun 23 12:22:26 2003 +@@ -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 */ ++ +diff -Nru a/include/linux/reboot.h b/include/linux/reboot.h +--- a/include/linux/reboot.h Mon Jun 23 12:22:26 2003 ++++ b/include/linux/reboot.h Mon Jun 23 12:22:26 2003 +@@ -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__ +diff -Nru a/kernel/Makefile b/kernel/Makefile +--- a/kernel/Makefile Mon Jun 23 12:22:26 2003 ++++ b/kernel/Makefile Mon Jun 23 12:22:26 2003 +@@ -18,6 +18,7 @@ + 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) +diff -Nru a/kernel/kexec.c b/kernel/kexec.c +--- /dev/null Wed Dec 31 16:00:00 1969 ++++ b/kernel/kexec.c Mon Jun 23 12:22:26 2003 +@@ -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; ++} +diff -Nru a/kernel/sys.c b/kernel/sys.c +--- a/kernel/sys.c Mon Jun 23 12:22:26 2003 ++++ b/kernel/sys.c Mon Jun 23 12:22:26 2003 +@@ -16,6 +16,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> +@@ -207,6 +208,7 @@ + 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) +@@ -450,6 +452,27 @@ + 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/kexec-2.6.0-full.patch b/lustre/kernel_patches/patches/kexec-2.6.0-full.patch new file mode 100644 index 0000000000..7e2ee63c29 --- /dev/null +++ b/lustre/kernel_patches/patches/kexec-2.6.0-full.patch @@ -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/kgdb-ga-2.5.73.patch b/lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch new file mode 100644 index 0000000000..b3e0bbe45f --- /dev/null +++ b/lustre/kernel_patches/patches/kgdb-ga-2.5.73.patch @@ -0,0 +1,5046 @@ + + +This kgdb will get called and will trap almost any kernel +fault WITHOUT BEING ARMED. + +It is entered at boot time via "kgdb" in the boot string, +not "gdb". This entry occurs when the first setup on the +boot string is called, not sometime later. You will not +find a "waiting for gdb" on your console, as the console has +not yet been enabled at this time. (Note, this early stuff +is a bit fragile as the full trap table has yet to be +loaded, something I might address, sometime... So don't try +to look at memory that can not be reached, for example. +Once the full trap table is loaded this restriction goes +away.) + +If you hard code it, you can put a breakpoint() as the FIRST +LINE OF C CODE. + +It does NOT use the serial driver, but if the serial driver +is loaded, it tells it to release the port to avoid +conflict. + +The threads stuff is not configurable, does not require +redirection of schedule() calls and does back track to the +first non schedule() caller on the info threads command. If +you switch to the thread, however, it will show it in the +switch code (as it should). + +It is MUCH more aggressive and paranoid about grabbing the +other cpus on entry. It issues a "send_nmi_all_but_self()" +rather than depending on them to interrupt or hit an NMI +sometime in the distant future. If a cpu does not come to +the party, it will continue without it so all is not lost. + +It does not have anything to do with IOCTL calls, but does +do the control-C thing. + +There is a LOT of info in the patch which ends up in +.../Documentation/i386/kgdb/* + +There is a nifty little thing call kgdb_ts() (kgdb time +stamp) which is a function you can code calls to which puts +some useful stuff in a circular buffer which can be examined +with the supplied gdb macros. + +It also allows you do to do "p foobar(...)" i.e. to call a +function from gdb, just like gdb allows in program +debugging. + +In an SMP system, you can choose to "hold" any given set of +cpus. It also defaults to holding other cpus on single step +(this can be overridden). + +This said, you can imagine my consternation when I found it +"lost it" on continues on 2.5. I found and fixed this this +early pm, a hold cpu on exit goof on my part. + +Oh, and a final point, the configure options are more +extensive (the serial port is set up here, for example, (can +not wait for a command line to do this)). There is one to +do system call exit tests. This is VERY new and causes the +kernel to hit a hard "int 3" if a system call attempts to +exit with preempt count other than zero. This is a fault, +of course, but the current 2.5 is full of them so I don't +recommend turning this on. + + + + + Documentation/i386/kgdb/andthen | 100 + + Documentation/i386/kgdb/debug-nmi.txt | 37 + Documentation/i386/kgdb/gdb-globals.txt | 71 + + Documentation/i386/kgdb/gdbinit | 14 + Documentation/i386/kgdb/gdbinit-modules | 146 ++ + Documentation/i386/kgdb/gdbinit.hw | 117 + + Documentation/i386/kgdb/kgdb.txt | 715 ++++++++++ + Documentation/i386/kgdb/loadmodule.sh | 78 + + MAINTAINERS | 6 + arch/i386/Kconfig | 180 ++ + arch/i386/Makefile | 3 + arch/i386/kernel/Makefile | 1 + arch/i386/kernel/entry.S | 28 + arch/i386/kernel/kgdb_stub.c | 2214 ++++++++++++++++++++++++++++++++ + arch/i386/kernel/nmi.c | 25 + arch/i386/kernel/smp.c | 12 + arch/i386/kernel/traps.c | 86 + + arch/i386/lib/Makefile | 1 + arch/i386/lib/kgdb_serial.c | 485 +++++++ + arch/i386/mm/fault.c | 6 + drivers/char/keyboard.c | 3 + drivers/char/sysrq.c | 15 + drivers/serial/8250.c | 42 + include/asm-i386/bugs.h | 21 + include/asm-i386/kgdb.h | 59 + include/asm-i386/kgdb_local.h | 102 + + include/linux/config.h | 3 + kernel/sched.c | 7 + 28 files changed, 4565 insertions(+), 12 deletions(-) + +diff -puN arch/i386/Kconfig~kgdb-ga arch/i386/Kconfig +--- 25/arch/i386/Kconfig~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/Kconfig 2003-06-25 23:14:17.000000000 -0700 +@@ -1419,14 +1419,194 @@ config DEBUG_SPINLOCK_SLEEP + 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 +diff -puN arch/i386/kernel/entry.S~kgdb-ga arch/i386/kernel/entry.S +--- 25/arch/i386/kernel/entry.S~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/kernel/entry.S 2003-06-25 23:14:17.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 +diff -puN /dev/null arch/i386/kernel/kgdb_stub.c +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/arch/i386/kernel/kgdb_stub.c 2003-06-25 23:14:17.000000000 -0700 +@@ -0,0 +1,2214 @@ ++/* ++ * ++ * 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() ++extern volatile unsigned long cpu_callout_map; ++#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(®s);\ ++ }\ ++ 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) ++extern volatile unsigned long cpu_callout_map; ++#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) ®s->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(®s); ++} ++#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(®s); ++ 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 (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; ++ } ++ ++ 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(®s); ++ 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(®s); ++ 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, ®s, 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, ®s); ++ 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, ®s); ++ if ((!usethread || usethread == current) && ++ hexToInt(&ptr, ®no) && ++ *ptr++ == '=' && (regno >= 0)) { ++ regno = ++ (regno >= NUMREGS ? _GS : regno); ++ hex2mem(ptr, (char *) &gdb_regs[regno], ++ 4, 0); ++ gdb_regs_to_regs(gdb_regs, ®s); ++ 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(®s); ++ } ++ 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 && 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); ++ } ++ exit_just_unlock: ++#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... */ +diff -puN arch/i386/kernel/Makefile~kgdb-ga arch/i386/kernel/Makefile +--- 25/arch/i386/kernel/Makefile~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/kernel/Makefile 2003-06-25 23:14:17.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 +diff -puN arch/i386/kernel/nmi.c~kgdb-ga arch/i386/kernel/nmi.c +--- 25/arch/i386/kernel/nmi.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/kernel/nmi.c 2003-06-25 23:14:17.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); +@@ -398,6 +408,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) + { +@@ -411,12 +424,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); + /* +diff -puN arch/i386/kernel/smp.c~kgdb-ga arch/i386/kernel/smp.c +--- 25/arch/i386/kernel/smp.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/kernel/smp.c 2003-06-25 23:14:17.000000000 -0700 +@@ -459,7 +459,17 @@ void smp_send_reschedule(int cpu) + { + send_IPI_mask(1 << 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. +diff -puN arch/i386/kernel/traps.c~kgdb-ga arch/i386/kernel/traps.c +--- 25/arch/i386/kernel/traps.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/kernel/traps.c 2003-06-25 23:14:17.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) +@@ -258,6 +294,15 @@ void die(const char * str, struct pt_reg + bust_spinlocks(1); + handle_BUG(regs); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); ++#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 +372,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 +390,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 +435,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 +600,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 +623,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 +648,7 @@ clear_dr7: + __asm__("movl %0,%%db7" + : /* no output */ + : "r" (0)); ++ CHK_REMOTE_DEBUG(1,SIGTRAP,error_code,regs,) + return; + + debug_vm86: +@@ -823,6 +895,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 +927,11 @@ void __init trap_init(void) + set_trap_gate(0,÷_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); +diff -puN /dev/null arch/i386/lib/kgdb_serial.c +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/arch/i386/lib/kgdb_serial.c 2003-06-25 23:14:17.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); +diff -puN arch/i386/lib/Makefile~kgdb-ga arch/i386/lib/Makefile +--- 25/arch/i386/lib/Makefile~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/lib/Makefile 2003-06-25 23:14:17.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 +diff -puN arch/i386/Makefile~kgdb-ga arch/i386/Makefile +--- 25/arch/i386/Makefile~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/Makefile 2003-06-25 23:14:17.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) += -g ++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/ +diff -puN arch/i386/mm/fault.c~kgdb-ga arch/i386/mm/fault.c +--- 25/arch/i386/mm/fault.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/arch/i386/mm/fault.c 2003-06-25 23:14:17.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); + +diff -puN /dev/null Documentation/i386/kgdb/andthen +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/andthen 2003-06-25 23:14:17.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 +diff -puN /dev/null Documentation/i386/kgdb/debug-nmi.txt +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/debug-nmi.txt 2003-06-25 23:14:17.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) +diff -puN /dev/null Documentation/i386/kgdb/gdb-globals.txt +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/gdb-globals.txt 2003-06-25 23:14:17.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 ) +diff -puN /dev/null Documentation/i386/kgdb/gdbinit +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/gdbinit 2003-06-25 23:14:17.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 +diff -puN /dev/null Documentation/i386/kgdb/gdbinit.hw +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/gdbinit.hw 2003-06-25 23:14:17.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 +diff -puN /dev/null Documentation/i386/kgdb/gdbinit-modules +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/gdbinit-modules 2003-06-25 23:14:17.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 +diff -puN /dev/null Documentation/i386/kgdb/kgdb.txt +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/kgdb.txt 2003-06-25 23:14:17.000000000 -0700 +@@ -0,0 +1,715 @@ ++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 sting to start kgdb at ++boot time has been changed from "kgdb" to "gdb". ++ ++Andrew Morton sent a couple of patchs 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 break point in the function you are ++ not allowed to call another (gdb limitation, not kgdb). T0 help ++ this capability we added a memory allocation function. Gdb does not ++ return this memory (it is used for stings 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 any ++ where else in the system, but it is "nice" here. c.) The tasks ++ "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 ++ where in it numbers each thread with its reference number followed ++ by the threads 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 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, lets 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 break point? 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 is 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 tighten 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 a modem ++eliminator and the appropriate cables. ++ ++Decide on which tty port you want the machines to communicate, then ++cable them up back-to-back using the null modem. 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 and the irq addresses. ++ ++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 base ++line 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 break point. (In the case where the system is ++already at a break point 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 break points 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. With ++in 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) in the serial line. ++e.g. echo -e "\003" > /dev/ttyS1 This forces that target machine into ++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 def: ++ ++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 a IPI/ NMI. +\ No newline at end of file +diff -puN /dev/null Documentation/i386/kgdb/loadmodule.sh +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/loadmodule.sh 2003-06-25 23:14:17.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 +diff -puN drivers/char/keyboard.c~kgdb-ga drivers/char/keyboard.c +--- 25/drivers/char/keyboard.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/drivers/char/keyboard.c 2003-06-25 23:14:17.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 +diff -puN drivers/char/sysrq.c~kgdb-ga drivers/char/sysrq.c +--- 25/drivers/char/sysrq.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/drivers/char/sysrq.c 2003-06-25 23:14:17.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, +diff -puN drivers/serial/8250.c~kgdb-ga drivers/serial/8250.c +--- 25/drivers/serial/8250.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/drivers/serial/8250.c 2003-06-25 23:14:17.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; +diff -puN include/asm-i386/bugs.h~kgdb-ga include/asm-i386/bugs.h +--- 25/include/asm-i386/bugs.h~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/include/asm-i386/bugs.h 2003-06-25 23:14:17.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 + } + +diff -puN /dev/null include/asm-i386/kgdb.h +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/include/asm-i386/kgdb.h 2003-06-25 23:14:17.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 */ +diff -puN /dev/null include/asm-i386/kgdb_local.h +--- /dev/null 2002-08-30 16:31:37.000000000 -0700 ++++ 25-akpm/include/asm-i386/kgdb_local.h 2003-06-25 23:14:17.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 */ +diff -puN include/linux/config.h~kgdb-ga include/linux/config.h +--- 25/include/linux/config.h~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/include/linux/config.h 2003-06-25 23:14:17.000000000 -0700 +@@ -2,5 +2,8 @@ + #define _LINUX_CONFIG_H + + #include <linux/autoconf.h> ++#ifdef CONFIG_X86 ++#include <asm/kgdb.h> ++#endif + + #endif +diff -puN kernel/sched.c~kgdb-ga kernel/sched.c +--- 25/kernel/sched.c~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/kernel/sched.c 2003-06-25 23:14:17.000000000 -0700 +@@ -1604,6 +1604,13 @@ out_unlock: + task_rq_unlock(rq, &flags); + } + ++#if defined( CONFIG_KGDB) ++struct task_struct * kgdb_get_idle(int this_cpu) ++{ ++ return runqueues[this_cpu].idle; ++} ++#endif ++ + #ifndef __alpha__ + + /* +diff -puN MAINTAINERS~kgdb-ga MAINTAINERS +--- 25/MAINTAINERS~kgdb-ga 2003-06-25 23:14:17.000000000 -0700 ++++ 25-akpm/MAINTAINERS 2003-06-25 23:14:17.000000000 -0700 +@@ -1059,6 +1059,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 + +_ diff --git a/lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch b/lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch new file mode 100644 index 0000000000..47d451c51d --- /dev/null +++ b/lustre/kernel_patches/patches/kgdb-ga-docco-fixes-2.5.73.patch @@ -0,0 +1,347 @@ + +From: "Randy.Dunlap" <rddunlap@osdl.org> + +Just some readability fixes. + + + + Documentation/i386/kgdb/kgdb.txt | 135 +++++++++++++++++++-------------------- + 1 files changed, 68 insertions(+), 67 deletions(-) + +diff -puN Documentation/i386/kgdb/kgdb.txt~kgdb-gs-docco-fixes Documentation/i386/kgdb/kgdb.txt +--- 25/Documentation/i386/kgdb/kgdb.txt~kgdb-gs-docco-fixes 2003-06-26 17:32:25.000000000 -0700 ++++ 25-akpm/Documentation/i386/kgdb/kgdb.txt 2003-06-26 17:32:25.000000000 -0700 +@@ -6,10 +6,10 @@ New features: + ============ + 20030505.1827.27 + We are starting to align with the sourceforge version, at least in +-commands. To this end, the boot command sting to start kgdb at ++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 patchs which are now included as follows: ++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 +@@ -27,18 +27,18 @@ This is currently the version for the 2. + + 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 :) ++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 break point in the function you are +- not allowed to call another (gdb limitation, not kgdb). T0 help ++ 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 stings you pass to that function ++ 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). + +@@ -61,23 +61,23 @@ $2 = {used_malloc = 0, called_from = 0xc + 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 any +- where else in the system, but it is "nice" here. c.) The tasks ++ 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 +- where in it numbers each thread with its reference number followed +- by the threads 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). ++ 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 above. ++ 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 ++ that are active on the other CPUs. This allows better trace back on + those tasks. + +- And, lets mention what we could not fix. Back-trace from all but the ++ 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 +@@ -88,9 +88,9 @@ $2 = {used_malloc = 0, called_from = 0xc + + 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 ++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 +@@ -111,14 +111,14 @@ $4 = {called_from = 0xc010732c, entry_ts + + "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 break point? The simple way to interrogate this ++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 ++"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 +@@ -139,34 +139,34 @@ $7 = {called_from = 0xc0112739, entry_ts + 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 ++"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 ++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. ++will print the registers for CPU 1. + + "Hold_on_sstep" is a new feature with this version and comes up set or +-true. What is 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: ++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. ++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, ++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. ++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 tighten up the interrupt and SMP ++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. +@@ -190,18 +190,18 @@ machine. This is the machine that will + 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 a modem +-eliminator and the appropriate cables. ++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 +-cable them up back-to-back using the null modem. 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: ++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 and the irq addresses. ++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 +@@ -212,7 +212,7 @@ On your DEVELOPMENT machine, go to your + 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 ++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: + +@@ -231,16 +231,16 @@ The baud rate. Default is 115200. What + 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 ++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). ++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 base +-line code, but the i386 does not.) ++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 +@@ -251,9 +251,9 @@ This will happen before any kernel outpu + 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 ++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. ++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 +@@ -360,11 +360,11 @@ 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 ++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 break point. (In the case where the system is +-already at a break point the control C is not needed, however, it will ++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 +@@ -442,7 +442,7 @@ turn on a debug switch with the followin + 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 ++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 +@@ -454,7 +454,7 @@ it finds. (You need to wait so that the + 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 break points especially in 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 +@@ -464,7 +464,7 @@ don't connect, review your answers for t + + setserial /dev/ttyS0 + +-to get the current port and irq information. This command will also ++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: + +@@ -581,11 +581,11 @@ When a breakpoint occurs or user issues + 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. With +-in 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 ++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 ++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. + +@@ -601,22 +601,23 @@ Kill it. restart gdb. Connect to target + 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) in the serial line. +-e.g. echo -e "\003" > /dev/ttyS1 This forces that target machine into +-debugger after which you can connect. ++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 ++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 ++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 +@@ -631,7 +632,7 @@ 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 def: ++Here is the array definition: + + struct kgdb_and_then_struct { + #ifdef CONFIG_SMP +@@ -646,7 +647,7 @@ struct kgdb_and_then_struct { + int data1; + }; + +-For SMP machines the cpu is recorded, for all machines the TSC is ++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 +@@ -709,7 +710,7 @@ Amit S. Kale + 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. ++ 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 a IPI/ NMI. +\ No newline at end of file ++ Now collect the "other" cpus with an IPI/ NMI. + +_ diff --git a/lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch b/lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch new file mode 100644 index 0000000000..da07bd96cb --- /dev/null +++ b/lustre/kernel_patches/patches/kgdb-use-ggdb-2.5.73.patch @@ -0,0 +1,17 @@ + arch/i386/Makefile | 2 +- + 1 files changed, 1 insertion(+), 1 deletion(-) + +diff -puN arch/i386/Makefile~kgdb-use-ggdb arch/i386/Makefile +--- 25/arch/i386/Makefile~kgdb-use-ggdb 2003-06-14 22:54:41.000000000 -0700 ++++ 25-akpm/arch/i386/Makefile 2003-06-14 22:54:41.000000000 -0700 +@@ -85,7 +85,7 @@ mcore-$(CONFIG_X86_ES7000) := mach-es700 + # default subarch .h files + mflags-y += -Iinclude/asm-i386/mach-default + +-mflags-$(CONFIG_KGDB) += -g ++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 + +_ diff --git a/lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch b/lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch new file mode 100644 index 0000000000..ee9490955d --- /dev/null +++ b/lustre/kernel_patches/patches/lkcd-cvs-2.5.69.patch @@ -0,0 +1,6418 @@ +--- linux-2.5.69/drivers/dump/Makefile.lkcdbase Mon Jun 2 17:29:39 2003 ++++ linux-2.5.69/drivers/dump/Makefile Fri Apr 25 00:24:15 2003 +@@ -0,0 +1,14 @@ ++# ++# Makefile for the dump device drivers. ++# ++ ++dump-y := dump_setup.o dump_fmt.o dump_filters.o dump_scheme.o dump_execute.o ++dump-$(CONFIG_X86) += dump_i386.o ++dump-$(CONFIG_CRASH_DUMP_MEMDEV) += dump_memdev.o dump_overlay.o ++dump-objs += $(dump-y) ++ ++obj-$(CONFIG_CRASH_DUMP) += dump.o ++obj-$(CONFIG_CRASH_DUMP_BLOCKDEV) += dump_blockdev.o ++obj-$(CONFIG_CRASH_DUMP_NETDEV) += dump_netdev.o ++obj-$(CONFIG_CRASH_DUMP_COMPRESS_RLE) += dump_rle.o ++obj-$(CONFIG_CRASH_DUMP_COMPRESS_GZIP) += dump_gzip.o +--- linux-2.5.69/drivers/dump/dump_blockdev.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_blockdev.c Sun May 18 22:30:52 2003 +@@ -0,0 +1,461 @@ ++/* ++ * Implements the dump driver interface for saving a dump to ++ * a block device through the kernel's generic low level block i/o ++ * routines. ++ * ++ * Started: June 2002 - Mohamed Abbas <mohamed.abbas@intel.com> ++ * Moved original lkcd kiobuf dump i/o code from dump_base.c ++ * to use generic dump device interfaces ++ * ++ * Sept 2002 - Bharata B. Rao <bharata@in.ibm.com> ++ * Convert dump i/o to directly use bio instead of kiobuf for 2.5 ++ * ++ * Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * Rework to new dumpdev.h structures, implement open/close/ ++ * silence, misc fixes (blocknr removal, bio_add_page usage) ++ * ++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++#include <linux/types.h> ++#include <linux/proc_fs.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/blkdev.h> ++#include <linux/bio.h> ++#include <asm/hardirq.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++extern void *dump_page_buf; ++ ++/* The end_io callback for dump i/o completion */ ++static int ++dump_bio_end_io(struct bio *bio, unsigned int bytes_done, int error) ++{ ++ struct dump_blockdev *dump_bdev; ++ ++ if (bio->bi_size) { ++ /* some bytes still left to transfer */ ++ return 1; /* not complete */ ++ } ++ ++ dump_bdev = (struct dump_blockdev *)bio->bi_private; ++ if (error) { ++ printk("IO error while writing the dump, aborting\n"); ++ } ++ ++ dump_bdev->err = error; ++ ++ /* no wakeup needed, since caller polls for completion */ ++ return 0; ++} ++ ++/* Check if the dump bio is already mapped to the specified buffer */ ++static int ++dump_block_map_valid(struct dump_blockdev *dev, struct page *page, ++ int len) ++{ ++ struct bio *bio = dev->bio; ++ unsigned long bsize = 0; ++ ++ if (!bio->bi_vcnt) ++ return 0; /* first time, not mapped */ ++ ++ ++ if ((bio_page(bio) != page) || (len > bio->bi_vcnt << PAGE_SHIFT)) ++ return 0; /* buffer not mapped */ ++ ++ bsize = bdev_hardsect_size(bio->bi_bdev); ++ if ((len & (PAGE_SIZE - 1)) || (len & bsize)) ++ return 0; /* alignment checks needed */ ++ ++ /* quick check to decide if we need to redo bio_add_page */ ++ if (bdev_get_queue(bio->bi_bdev)->merge_bvec_fn) ++ return 0; /* device may have other restrictions */ ++ ++ return 1; /* already mapped */ ++} ++ ++/* ++ * Set up the dump bio for i/o from the specified buffer ++ * Return value indicates whether the full buffer could be mapped or not ++ */ ++static int ++dump_block_map(struct dump_blockdev *dev, void *buf, int len) ++{ ++ struct page *page = virt_to_page(buf); ++ struct bio *bio = dev->bio; ++ unsigned long bsize = 0; ++ ++ bio->bi_bdev = dev->bdev; ++ bio->bi_sector = (dev->start_offset + dev->ddev.curr_offset) >> 9; ++ bio->bi_idx = 0; /* reset index to the beginning */ ++ ++ if (dump_block_map_valid(dev, page, len)) { ++ /* already mapped and usable rightaway */ ++ bio->bi_size = len; /* reset size to the whole bio */ ++ } else { ++ /* need to map the bio */ ++ bio->bi_size = 0; ++ bio->bi_vcnt = 0; ++ bsize = bdev_hardsect_size(bio->bi_bdev); ++ ++ /* first a few sanity checks */ ++ if (len < bsize) { ++ printk("map: len less than hardsect size \n"); ++ return -EINVAL; ++ } ++ ++ if ((unsigned long)buf & bsize) { ++ printk("map: not aligned \n"); ++ return -EINVAL; ++ } ++ ++ /* assume contig. page aligned low mem buffer( no vmalloc) */ ++ if ((page_address(page) != buf) || (len & (PAGE_SIZE - 1))) { ++ printk("map: invalid buffer alignment!\n"); ++ return -EINVAL; ++ } ++ /* finally we can go ahead and map it */ ++ while (bio->bi_size < len) ++ if (bio_add_page(bio, page++, PAGE_SIZE, 0) == 0) { ++ break; ++ } ++ ++ bio->bi_end_io = dump_bio_end_io; ++ bio->bi_private = dev; ++ } ++ ++ if (bio->bi_size != len) { ++ printk("map: bio size = %d not enough for len = %d!\n", ++ bio->bi_size, len); ++ return -E2BIG; ++ } ++ return 0; ++} ++ ++static void ++dump_free_bio(struct bio *bio) ++{ ++ if (bio) ++ kfree(bio->bi_io_vec); ++ kfree(bio); ++} ++ ++/* ++ * Prepares the dump device so we can take a dump later. ++ * The caller is expected to have filled up the kdev_id field in the ++ * block dump dev structure. ++ * ++ * At dump time when dump_block_write() is invoked it will be too ++ * late to recover, so as far as possible make sure obvious errors ++ * get caught right here and reported back to the caller. ++ */ ++static int ++dump_block_open(struct dump_dev *dev, unsigned long arg) ++{ ++ struct dump_blockdev *dump_bdev = DUMP_BDEV(dev); ++ struct block_device *bdev; ++ int retval = 0; ++ struct bio_vec *bvec; ++ ++ /* make sure this is a valid block device */ ++ if (!arg) { ++ retval = -EINVAL; ++ goto err; ++ } ++ ++ /* get a corresponding block_dev struct for this */ ++ bdev = bdget((dev_t)arg); ++ if (!bdev) { ++ retval = -ENODEV; ++ goto err; ++ } ++ ++ /* get the block device opened */ ++ if ((retval = blkdev_get(bdev, O_RDWR | O_LARGEFILE, 0, BDEV_RAW))) { ++ goto err1; ++ } ++ ++ if ((dump_bdev->bio = kmalloc(sizeof(struct bio), GFP_KERNEL)) ++ == NULL) { ++ printk("Cannot allocate bio\n"); ++ retval = -ENOMEM; ++ goto err2; ++ } ++ ++ bio_init(dump_bdev->bio); ++ ++ if ((bvec = kmalloc(sizeof(struct bio_vec) * ++ (DUMP_BUFFER_SIZE >> PAGE_SHIFT), GFP_KERNEL)) == NULL) { ++ retval = -ENOMEM; ++ goto err3; ++ } ++ ++ /* assign the new dump dev structure */ ++ dump_bdev->kdev_id = to_kdev_t((dev_t)arg); ++ dump_bdev->bdev = bdev; ++ ++ /* make a note of the limit */ ++ dump_bdev->limit = bdev->bd_inode->i_size; ++ ++ /* now make sure we can map the dump buffer */ ++ dump_bdev->bio->bi_io_vec = bvec; ++ dump_bdev->bio->bi_max_vecs = DUMP_BUFFER_SIZE >> PAGE_SHIFT; ++ ++ retval = dump_block_map(dump_bdev, dump_config.dumper->dump_buf, ++ DUMP_BUFFER_SIZE); ++ ++ if (retval) { ++ printk("open: dump_block_map failed, ret %d\n", retval); ++ goto err3; ++ } ++ ++ printk("Block device (%d,%d) successfully configured for dumping\n", ++ major(dump_bdev->kdev_id), ++ minor(dump_bdev->kdev_id)); ++ ++ ++ /* after opening the block device, return */ ++ return retval; ++ ++err3: dump_free_bio(dump_bdev->bio); ++ dump_bdev->bio = NULL; ++err2: if (bdev) blkdev_put(bdev, BDEV_RAW); ++ goto err; ++err1: if (bdev) bdput(bdev); ++ dump_bdev->bdev = NULL; ++err: return retval; ++} ++ ++/* ++ * Close the dump device and release associated resources ++ * Invoked when unconfiguring the dump device. ++ */ ++static int ++dump_block_release(struct dump_dev *dev) ++{ ++ struct dump_blockdev *dump_bdev = DUMP_BDEV(dev); ++ ++ /* release earlier bdev if present */ ++ if (dump_bdev->bdev) { ++ blkdev_put(dump_bdev->bdev, BDEV_RAW); ++ dump_bdev->bdev = NULL; ++ } ++ ++ dump_free_bio(dump_bdev->bio); ++ dump_bdev->bio = NULL; ++ ++ return 0; ++} ++ ++ ++/* ++ * Prepare the dump device for use (silence any ongoing activity ++ * and quiesce state) when the system crashes. ++ */ ++static int ++dump_block_silence(struct dump_dev *dev) ++{ ++ struct dump_blockdev *dump_bdev = DUMP_BDEV(dev); ++ struct request_queue *q = bdev_get_queue(dump_bdev->bdev); ++ int ret; ++ ++ /* If we can't get request queue lock, refuse to take the dump */ ++ if (!spin_trylock(q->queue_lock)) ++ return -EBUSY; ++ ++ ret = elv_queue_empty(q); ++ spin_unlock(q->queue_lock); ++ ++ /* For now we assume we have the device to ourselves */ ++ /* Just a quick sanity check */ ++ if (!ret) { ++ /* i/o in flight - safer to quit */ ++ return -EBUSY; ++ } ++ ++ /* ++ * Move to a softer level of silencing where no spin_lock_irqs ++ * are held on other cpus ++ */ ++ dump_silence_level = DUMP_SOFT_SPIN_CPUS; ++ ++ __dump_irq_enable(); ++ ++ printk("Dumping to block device (%d,%d) on CPU %d ...\n", ++ major(dump_bdev->kdev_id), minor(dump_bdev->kdev_id), ++ smp_processor_id()); ++ ++ return 0; ++} ++ ++/* ++ * Invoked when dumping is done. This is the time to put things back ++ * (i.e. undo the effects of dump_block_silence) so the device is ++ * available for normal use. ++ */ ++static int ++dump_block_resume(struct dump_dev *dev) ++{ ++ __dump_irq_restore(); ++ return 0; ++} ++ ++ ++/* ++ * Seek to the specified offset in the dump device. ++ * Makes sure this is a valid offset, otherwise returns an error. ++ */ ++static int ++dump_block_seek(struct dump_dev *dev, loff_t off) ++{ ++ struct dump_blockdev *dump_bdev = DUMP_BDEV(dev); ++ loff_t offset = off + dump_bdev->start_offset; ++ ++ if (offset & ( PAGE_SIZE - 1)) { ++ printk("seek: non-page aligned\n"); ++ return -EINVAL; ++ } ++ ++ if (offset & (bdev_hardsect_size(dump_bdev->bdev) - 1)) { ++ printk("seek: not sector aligned \n"); ++ return -EINVAL; ++ } ++ ++ if (offset > dump_bdev->limit) { ++ printk("seek: not enough space left on device!\n"); ++ return -ENOSPC; ++ } ++ dev->curr_offset = off; ++ return 0; ++} ++ ++/* ++ * Write out a buffer after checking the device limitations, ++ * sector sizes, etc. Assumes the buffer is in directly mapped ++ * kernel address space (not vmalloc'ed). ++ * ++ * Returns: number of bytes written or -ERRNO. ++ */ ++static int ++dump_block_write(struct dump_dev *dev, void *buf, ++ unsigned long len) ++{ ++ struct dump_blockdev *dump_bdev = DUMP_BDEV(dev); ++ loff_t offset = dev->curr_offset + dump_bdev->start_offset; ++ int retval = -ENOSPC; ++ ++ if (offset >= dump_bdev->limit) { ++ printk("write: not enough space left on device!\n"); ++ goto out; ++ } ++ ++ /* don't write more blocks than our max limit */ ++ if (offset + len > dump_bdev->limit) ++ len = dump_bdev->limit - offset; ++ ++ ++ retval = dump_block_map(dump_bdev, buf, len); ++ if (retval){ ++ printk("write: dump_block_map failed! err %d\n", retval); ++ goto out; ++ } ++ ++ /* ++ * Write out the data to disk. ++ * Assumes the entire buffer mapped to a single bio, which we can ++ * submit and wait for io completion. In the future, may consider ++ * increasing the dump buffer size and submitting multiple bio s ++ * for better throughput. ++ */ ++ dump_bdev->err = -EAGAIN; ++ submit_bio(WRITE, dump_bdev->bio); ++ ++ dump_bdev->ddev.curr_offset += len; ++ retval = len; ++ out: ++ return retval; ++} ++ ++/* ++ * Name: dump_block_ready() ++ * Func: check if the last dump i/o is over and ready for next request ++ */ ++static int ++dump_block_ready(struct dump_dev *dev, void *buf) ++{ ++ struct dump_blockdev *dump_bdev = DUMP_BDEV(dev); ++ request_queue_t *q = bdev_get_queue(dump_bdev->bio->bi_bdev); ++ ++ /* check for io completion */ ++ if (dump_bdev->err == -EAGAIN) { ++ q->unplug_fn(q); ++ return -EAGAIN; ++ } ++ ++ if (dump_bdev->err) { ++ printk("dump i/o err\n"); ++ return dump_bdev->err; ++ } ++ ++ return 0; ++} ++ ++ ++struct dump_dev_ops dump_blockdev_ops = { ++ .open = dump_block_open, ++ .release = dump_block_release, ++ .silence = dump_block_silence, ++ .resume = dump_block_resume, ++ .seek = dump_block_seek, ++ .write = dump_block_write, ++ /* .read not implemented */ ++ .ready = dump_block_ready ++}; ++ ++static struct dump_blockdev default_dump_blockdev = { ++ .ddev = {.type_name = "blockdev", .ops = &dump_blockdev_ops, ++ .curr_offset = 0}, ++ /* ++ * leave enough room for the longest swap header possibly written ++ * written by mkswap (likely the largest page size supported by ++ * the arch ++ */ ++ .start_offset = DUMP_HEADER_OFFSET, ++ .err = 0 ++ /* assume the rest of the fields are zeroed by default */ ++}; ++ ++struct dump_blockdev *dump_blockdev = &default_dump_blockdev; ++ ++static int __init ++dump_blockdev_init(void) ++{ ++ if (dump_register_device(&dump_blockdev->ddev) < 0) { ++ printk("block device driver registration failed\n"); ++ return -1; ++ } ++ ++ printk("block device driver for LKCD registered\n"); ++ return 0; ++} ++ ++static void __exit ++dump_blockdev_cleanup(void) ++{ ++ dump_unregister_device(&dump_blockdev->ddev); ++ printk("block device driver for LKCD unregistered\n"); ++} ++ ++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>"); ++MODULE_DESCRIPTION("Block Dump Driver for Linux Kernel Crash Dump (LKCD)"); ++MODULE_LICENSE("GPL"); ++ ++module_init(dump_blockdev_init); ++module_exit(dump_blockdev_cleanup); +--- linux-2.5.69/drivers/dump/dump_execute.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_execute.c Fri Feb 7 06:47:58 2003 +@@ -0,0 +1,126 @@ ++/* ++ * The file has the common/generic dump execution code ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * Split and rewrote high level dump execute code to make use ++ * of dump method interfaces. ++ * ++ * Derived from original code in dump_base.c created by ++ * Matt Robinson <yakker@sourceforge.net>) ++ * ++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * Assumes dumper and dump config settings are in place ++ * (invokes corresponding dumper specific routines as applicable) ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++#include <linux/kernel.h> ++#include <linux/notifier.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++struct notifier_block *dump_notifier_list; /* dump started/ended callback */ ++ ++/* Dump progress indicator */ ++void ++dump_speedo(int i) ++{ ++ static const char twiddle[4] = { '|', '\\', '-', '/' }; ++ printk("%c\b", twiddle[i&3]); ++} ++ ++/* Make the device ready and write out the header */ ++int dump_begin(void) ++{ ++ int err = 0; ++ ++ /* dump_dev = dump_config.dumper->dev; */ ++ dumper_reset(); ++ if ((err = dump_dev_silence())) { ++ /* quiesce failed, can't risk continuing */ ++ /* Todo/Future: switch to alternate dump scheme if possible */ ++ printk("dump silence dev failed ! error %d\n", err); ++ return err; ++ } ++ ++ pr_debug("Writing dump header\n"); ++ if ((err = dump_update_header())) { ++ printk("dump update header failed ! error %d\n", err); ++ dump_dev_resume(); ++ return err; ++ } ++ ++ dump_config.dumper->curr_offset = DUMP_BUFFER_SIZE; ++ ++ return 0; ++} ++ ++/* ++ * Write the dump terminator, a final header update and let go of ++ * exclusive use of the device for dump. ++ */ ++int dump_complete(void) ++{ ++ int ret = 0; ++ ++ if (dump_config.level != DUMP_LEVEL_HEADER) { ++ if ((ret = dump_update_end_marker())) { ++ printk("dump update end marker error %d\n", ret); ++ } ++ if ((ret = dump_update_header())) { ++ printk("dump update header error %d\n", ret); ++ } ++ } ++ ret = dump_dev_resume(); ++ ++ return ret; ++} ++ ++/* Saves all dump data */ ++int dump_execute_savedump(void) ++{ ++ int ret = 0, err = 0; ++ ++ if ((ret = dump_begin())) { ++ return ret; ++ } ++ ++ if (dump_config.level != DUMP_LEVEL_HEADER) { ++ ret = dump_sequencer(); ++ } ++ if ((err = dump_complete())) { ++ printk("Dump complete failed. Error %d\n", err); ++ } ++ ++ return ret; ++} ++ ++/* Does all the real work: Capture and save state */ ++int dump_generic_execute(const char *panic_str, const struct pt_regs *regs) ++{ ++ int ret = 0; ++ ++ if ((ret = dump_configure_header(panic_str, regs))) { ++ printk("dump config header failed ! error %d\n", ret); ++ return ret; ++ } ++ ++ /* tell interested parties that a dump is about to start */ ++ notifier_call_chain(&dump_notifier_list, DUMP_BEGIN, ++ &dump_config.dump_device); ++ ++ if (dump_config.level != DUMP_LEVEL_NONE) ++ ret = dump_execute_savedump(); ++ ++ pr_debug("dumped %ld blocks of %d bytes each\n", ++ dump_config.dumper->count, DUMP_BUFFER_SIZE); ++ ++ /* tell interested parties that a dump has completed */ ++ notifier_call_chain(&dump_notifier_list, DUMP_END, ++ &dump_config.dump_device); ++ ++ return ret; ++} +--- linux-2.5.69/drivers/dump/dump_filters.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_filters.c Mon Feb 3 05:06:28 2003 +@@ -0,0 +1,143 @@ ++/* ++ * Default filters to select data to dump for various passes. ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * Split and rewrote default dump selection logic to generic dump ++ * method interfaces ++ * Derived from a portion of dump_base.c created by ++ * Matt Robinson <yakker@sourceforge.net>) ++ * ++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * Used during single-stage dumping and during stage 1 of the 2-stage scheme ++ * (Stage 2 of the 2-stage scheme uses the fully transparent filters ++ * i.e. passthru filters in dump_overlay.c) ++ * ++ * Future: Custom selective dump may involve a different set of filters. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/bootmem.h> ++#include <linux/mm.h> ++#include <linux/slab.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++ ++/* Copied from mm/bootmem.c - FIXME */ ++/* return the number of _pages_ that will be allocated for the boot bitmap */ ++unsigned long dump_calc_bootmap_pages (void) ++{ ++ unsigned long mapsize; ++ unsigned long pages = num_physpages; ++ ++ mapsize = (pages+7)/8; ++ mapsize = (mapsize + ~PAGE_MASK) & PAGE_MASK; ++ mapsize >>= PAGE_SHIFT; ++ ++ return mapsize; ++} ++ ++ ++#define DUMP_PFN_SAFETY_MARGIN 1024 /* 4 MB */ ++/* temporary */ ++extern unsigned long min_low_pfn; ++ ++ ++int dump_low_page(struct page *p) ++{ ++ return page_to_pfn(p) < min_low_pfn + dump_calc_bootmap_pages() ++ + 1 + DUMP_PFN_SAFETY_MARGIN; ++} ++ ++static inline int kernel_page(struct page *p) ++{ ++ /* FIXME: Need to exclude hugetlb pages. Clue: reserved but inuse */ ++ return PageReserved(p) || (!PageLRU(p) && PageInuse(p)); ++} ++ ++static inline int user_page(struct page *p) ++{ ++ return PageInuse(p) && (!PageReserved(p) && PageLRU(p)); ++} ++ ++static inline int unreferenced_page(struct page *p) ++{ ++ return !PageInuse(p) && !PageReserved(p); ++} ++ ++ ++/* loc marks the beginning of a range of pages */ ++int dump_filter_kernpages(int pass, unsigned long loc, unsigned long sz) ++{ ++ struct page *page = (struct page *)loc; ++ /* if any of the pages is a kernel page, select this set */ ++ while (sz) { ++ if (dump_low_page(page) || kernel_page(page)) ++ return 1; ++ sz -= PAGE_SIZE; ++ page++; ++ } ++ return 0; ++} ++ ++ ++/* loc marks the beginning of a range of pages */ ++int dump_filter_userpages(int pass, unsigned long loc, unsigned long sz) ++{ ++ struct page *page = (struct page *)loc; ++ int ret = 0; ++ /* select if the set has any user page, and no kernel pages */ ++ while (sz) { ++ if (user_page(page) && !dump_low_page(page)) { ++ ret = 1; ++ } else if (kernel_page(page) || dump_low_page(page)) { ++ return 0; ++ } ++ page++; ++ sz -= PAGE_SIZE; ++ } ++ return ret; ++} ++ ++ ++ ++/* loc marks the beginning of a range of pages */ ++int dump_filter_unusedpages(int pass, unsigned long loc, unsigned long sz) ++{ ++ struct page *page = (struct page *)loc; ++ ++ /* select if the set does not have any used pages */ ++ while (sz) { ++ if (!unreferenced_page(page) || dump_low_page(page)) { ++ return 0; ++ } ++ page++; ++ sz -= PAGE_SIZE; ++ } ++ return 1; ++} ++ ++/* dummy: last (non-existent) pass */ ++int dump_filter_none(int pass, unsigned long loc, unsigned long sz) ++{ ++ return 0; ++} ++ ++/* TBD: resolve level bitmask ? */ ++struct dump_data_filter dump_filter_table[] = { ++ { .name = "kern", .selector = dump_filter_kernpages, ++ .level_mask = DUMP_MASK_KERN}, ++ { .name = "user", .selector = dump_filter_userpages, ++ .level_mask = DUMP_MASK_USED}, ++ { .name = "unused", .selector = dump_filter_unusedpages, ++ .level_mask = DUMP_MASK_UNUSED}, ++ { .name = "none", .selector = dump_filter_none, ++ .level_mask = DUMP_MASK_REST}, ++ { .name = "", .selector = NULL, .level_mask = 0} ++}; ++ +--- linux-2.5.69/drivers/dump/dump_fmt.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_fmt.c Fri Feb 7 06:47:58 2003 +@@ -0,0 +1,395 @@ ++/* ++ * Implements the routines which handle the format specific ++ * aspects of dump for the default dump format. ++ * ++ * Used in single stage dumping and stage 1 of soft-boot based dumping ++ * Saves data in LKCD (lcrash) format ++ * ++ * Previously a part of dump_base.c ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * Split off and reshuffled LKCD dump format code around generic ++ * dump method interfaces. ++ * ++ * Derived from original code created by ++ * Matt Robinson <yakker@sourceforge.net>) ++ * ++ * Contributions from SGI, IBM, HP, MCL, and others. ++ * ++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * Copyright (C) 2000 - 2002 TurboLinux, Inc. All rights reserved. ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++#include <linux/types.h> ++#include <linux/kernel.h> ++#include <linux/time.h> ++#include <linux/sched.h> ++#include <linux/ptrace.h> ++#include <linux/utsname.h> ++#include <asm/dump.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++/* ++ * SYSTEM DUMP LAYOUT ++ * ++ * System dumps are currently the combination of a dump header and a set ++ * of data pages which contain the system memory. The layout of the dump ++ * (for full dumps) is as follows: ++ * ++ * +-----------------------------+ ++ * | generic dump header | ++ * +-----------------------------+ ++ * | architecture dump header | ++ * +-----------------------------+ ++ * | page header | ++ * +-----------------------------+ ++ * | page data | ++ * +-----------------------------+ ++ * | page header | ++ * +-----------------------------+ ++ * | page data | ++ * +-----------------------------+ ++ * | | | ++ * | | | ++ * | | | ++ * | | | ++ * | V | ++ * +-----------------------------+ ++ * | PAGE_END header | ++ * +-----------------------------+ ++ * ++ * There are two dump headers, the first which is architecture ++ * independent, and the other which is architecture dependent. This ++ * allows different architectures to dump different data structures ++ * which are specific to their chipset, CPU, etc. ++ * ++ * After the dump headers come a succession of dump page headers along ++ * with dump pages. The page header contains information about the page ++ * size, any flags associated with the page (whether it's compressed or ++ * not), and the address of the page. After the page header is the page ++ * data, which is either compressed (or not). Each page of data is ++ * dumped in succession, until the final dump header (PAGE_END) is ++ * placed at the end of the dump, assuming the dump device isn't out ++ * of space. ++ * ++ * This mechanism allows for multiple compression types, different ++ * types of data structures, different page ordering, etc., etc., etc. ++ * It's a very straightforward mechanism for dumping system memory. ++ */ ++ ++struct __dump_header dump_header; /* the primary dump header */ ++struct __dump_header_asm dump_header_asm; /* the arch-specific dump header */ ++ ++/* ++ * Set up common header fields (mainly the arch indep section) ++ * Per-cpu state is handled by lcrash_save_context ++ * Returns the size of the header in bytes. ++ */ ++static int lcrash_init_dump_header(const char *panic_str) ++{ ++ struct timeval dh_time; ++ /* make sure the dump header isn't TOO big */ ++ if ((sizeof(struct __dump_header) + ++ sizeof(struct __dump_header_asm)) > DUMP_BUFFER_SIZE) { ++ printk("lcrash_init_header(): combined " ++ "headers larger than DUMP_BUFFER_SIZE!\n"); ++ return -E2BIG; ++ } ++ ++ /* initialize the dump headers to zero */ ++ memset(&dump_header, 0, sizeof(dump_header)); ++ memset(&dump_header_asm, 0, sizeof(dump_header_asm)); ++ ++ /* configure dump header values */ ++ dump_header.dh_magic_number = DUMP_MAGIC_NUMBER; ++ dump_header.dh_version = DUMP_VERSION_NUMBER; ++ dump_header.dh_memory_start = PAGE_OFFSET; ++ dump_header.dh_memory_end = DUMP_MAGIC_NUMBER; ++ dump_header.dh_header_size = sizeof(struct __dump_header); ++ dump_header.dh_page_size = PAGE_SIZE; ++ dump_header.dh_dump_level = dump_config.level; ++ dump_header.dh_current_task = (unsigned long) current; ++ dump_header.dh_dump_compress = dump_config.dumper->compress-> ++ compress_type; ++ dump_header.dh_dump_flags = dump_config.flags; ++ dump_header.dh_dump_device = dump_config.dumper->dev->device_id; ++ ++#if DUMP_DEBUG >= 6 ++ dump_header.dh_num_bytes = 0; ++#endif ++ dump_header.dh_num_dump_pages = 0; ++ do_gettimeofday(&dh_time); ++ dump_header.dh_time.tv_sec = dh_time.tv_sec; ++ dump_header.dh_time.tv_usec = dh_time.tv_usec; ++ ++ memcpy((void *)&(dump_header.dh_utsname_sysname), ++ (const void *)&(system_utsname.sysname), __NEW_UTS_LEN + 1); ++ memcpy((void *)&(dump_header.dh_utsname_nodename), ++ (const void *)&(system_utsname.nodename), __NEW_UTS_LEN + 1); ++ memcpy((void *)&(dump_header.dh_utsname_release), ++ (const void *)&(system_utsname.release), __NEW_UTS_LEN + 1); ++ memcpy((void *)&(dump_header.dh_utsname_version), ++ (const void *)&(system_utsname.version), __NEW_UTS_LEN + 1); ++ memcpy((void *)&(dump_header.dh_utsname_machine), ++ (const void *)&(system_utsname.machine), __NEW_UTS_LEN + 1); ++ memcpy((void *)&(dump_header.dh_utsname_domainname), ++ (const void *)&(system_utsname.domainname), __NEW_UTS_LEN + 1); ++ ++ if (panic_str) { ++ memcpy((void *)&(dump_header.dh_panic_string), ++ (const void *)panic_str, DUMP_PANIC_LEN); ++ } ++ ++ dump_header_asm.dha_magic_number = DUMP_ASM_MAGIC_NUMBER; ++ dump_header_asm.dha_version = DUMP_ASM_VERSION_NUMBER; ++ dump_header_asm.dha_header_size = sizeof(dump_header_asm); ++ ++ dump_header_asm.dha_smp_num_cpus = num_online_cpus(); ++ pr_debug("smp_num_cpus in header %d\n", ++ dump_header_asm.dha_smp_num_cpus); ++ ++ dump_header_asm.dha_dumping_cpu = smp_processor_id(); ++ ++ return sizeof(dump_header) + sizeof(dump_header_asm); ++} ++ ++ ++int dump_lcrash_configure_header(const char *panic_str, ++ const struct pt_regs *regs) ++{ ++ int retval = 0; ++ ++ dump_config.dumper->header_len = lcrash_init_dump_header(panic_str); ++ ++ /* capture register states for all processors */ ++ dump_save_this_cpu(regs); ++ __dump_save_other_cpus(); /* side effect:silence cpus */ ++ ++ /* configure architecture-specific dump header values */ ++ if ((retval = __dump_configure_header(regs))) ++ return retval; ++ ++ dump_config.dumper->header_dirty++; ++ return 0; ++} ++ ++/* save register and task context */ ++void dump_lcrash_save_context(int cpu, const struct pt_regs *regs, ++ struct task_struct *tsk) ++{ ++ dump_header_asm.dha_smp_current_task[cpu] = (uint32_t) tsk; ++ ++ __dump_save_regs(&dump_header_asm.dha_smp_regs[cpu], regs); ++ ++ /* take a snapshot of the stack */ ++ /* doing this enables us to tolerate slight drifts on this cpu */ ++ if (dump_header_asm.dha_stack[cpu]) { ++ memcpy((void *)dump_header_asm.dha_stack[cpu], ++ tsk->thread_info, THREAD_SIZE); ++ } ++ dump_header_asm.dha_stack_ptr[cpu] = (uint32_t)(tsk->thread_info); ++} ++ ++/* write out the header */ ++int dump_write_header(void) ++{ ++ int retval = 0, size; ++ void *buf = dump_config.dumper->dump_buf; ++ ++ /* accounts for DUMP_HEADER_OFFSET if applicable */ ++ if ((retval = dump_dev_seek(0))) { ++ printk("Unable to seek to dump header offset: %d\n", ++ retval); ++ return retval; ++ } ++ ++ memcpy(buf, (void *)&dump_header, sizeof(dump_header)); ++ size = sizeof(dump_header); ++ memcpy(buf + size, (void *)&dump_header_asm, sizeof(dump_header_asm)); ++ size += sizeof(dump_header_asm); ++ size = PAGE_ALIGN(size); ++ retval = dump_ll_write(buf , size); ++ ++ if (retval < size) ++ return (retval >= 0) ? ENOSPC : retval; ++ ++ return 0; ++} ++ ++int dump_generic_update_header(void) ++{ ++ int err = 0; ++ ++ if (dump_config.dumper->header_dirty) { ++ if ((err = dump_write_header())) { ++ printk("dump write header failed !err %d\n", err); ++ } else { ++ dump_config.dumper->header_dirty = 0; ++ } ++ } ++ ++ return err; ++} ++ ++static inline int is_curr_stack_page(struct page *page, unsigned long size) ++{ ++ unsigned long thread_addr = (unsigned long)current_thread_info(); ++ unsigned long addr = (unsigned long)page_address(page); ++ ++ return !PageHighMem(page) && (addr < thread_addr + THREAD_SIZE) ++ && (addr + size > thread_addr); ++} ++ ++static inline int is_dump_page(struct page *page, unsigned long size) ++{ ++ unsigned long addr = (unsigned long)page_address(page); ++ unsigned long dump_buf = (unsigned long)dump_config.dumper->dump_buf; ++ ++ return !PageHighMem(page) && (addr < dump_buf + DUMP_BUFFER_SIZE) ++ && (addr + size > dump_buf); ++} ++ ++int dump_allow_compress(struct page *page, unsigned long size) ++{ ++ /* ++ * Don't compress the page if any part of it overlaps ++ * with the current stack or dump buffer (since the contents ++ * in these could be changing while compression is going on) ++ */ ++ return !is_curr_stack_page(page, size) && !is_dump_page(page, size); ++} ++ ++void lcrash_init_pageheader(struct __dump_page *dp, struct page *page, ++ unsigned long sz) ++{ ++ memset(dp, sizeof(struct __dump_page), 0); ++ dp->dp_flags = 0; ++ dp->dp_size = 0; ++ if (sz > 0) ++ dp->dp_address = page_to_pfn(page) << PAGE_SHIFT; ++ ++#if DUMP_DEBUG > 6 ++ dp->dp_page_index = dump_header.dh_num_dump_pages; ++ dp->dp_byte_offset = dump_header.dh_num_bytes + DUMP_BUFFER_SIZE ++ + DUMP_HEADER_OFFSET; /* ?? */ ++#endif /* DUMP_DEBUG */ ++} ++ ++int dump_lcrash_add_data(unsigned long loc, unsigned long len) ++{ ++ struct page *page = (struct page *)loc; ++ void *addr, *buf = dump_config.dumper->curr_buf; ++ struct __dump_page *dp = (struct __dump_page *)buf; ++ int bytes, size; ++ ++ if (buf > dump_config.dumper->dump_buf + DUMP_BUFFER_SIZE) ++ return -ENOMEM; ++ ++ lcrash_init_pageheader(dp, page, len); ++ buf += sizeof(struct __dump_page); ++ ++ while (len) { ++ addr = kmap_atomic(page, KM_DUMP); ++ size = bytes = (len > PAGE_SIZE) ? PAGE_SIZE : len; ++ /* check for compression */ ++ if (dump_allow_compress(page, bytes)) { ++ size = dump_compress_data((char *)addr, bytes, (char *)buf); ++ } ++ /* set the compressed flag if the page did compress */ ++ if (size && (size < bytes)) { ++ dp->dp_flags |= DUMP_DH_COMPRESSED; ++ } else { ++ /* compression failed -- default to raw mode */ ++ dp->dp_flags |= DUMP_DH_RAW; ++ memcpy(buf, addr, bytes); ++ size = bytes; ++ } ++ /* memset(buf, 'A', size); temporary: testing only !! */ ++ kunmap_atomic(addr, KM_DUMP); ++ dp->dp_size += size; ++ buf += size; ++ len -= bytes; ++ page++; ++ } ++ ++ /* now update the header */ ++#if DUMP_DEBUG > 6 ++ dump_header.dh_num_bytes += dp->dp_size + sizeof(*dp); ++#endif ++ dump_header.dh_num_dump_pages++; ++ dump_config.dumper->header_dirty++; ++ ++ dump_config.dumper->curr_buf = buf; ++ ++ return len; ++} ++ ++int dump_lcrash_update_end_marker(void) ++{ ++ struct __dump_page *dp = ++ (struct __dump_page *)dump_config.dumper->curr_buf; ++ unsigned long left; ++ int ret = 0; ++ ++ lcrash_init_pageheader(dp, NULL, 0); ++ dp->dp_flags |= DUMP_DH_END; /* tbd: truncation test ? */ ++ ++ /* now update the header */ ++#if DUMP_DEBUG > 6 ++ dump_header.dh_num_bytes += sizeof(*dp); ++#endif ++ dump_config.dumper->curr_buf += sizeof(*dp); ++ left = dump_config.dumper->curr_buf - dump_config.dumper->dump_buf; ++ ++ printk("\n"); ++ ++ while (left) { ++ if ((ret = dump_dev_seek(dump_config.dumper->curr_offset))) { ++ printk("Seek failed at offset 0x%llx\n", ++ dump_config.dumper->curr_offset); ++ return ret; ++ } ++ ++ if (DUMP_BUFFER_SIZE > left) ++ memset(dump_config.dumper->curr_buf, 'm', ++ DUMP_BUFFER_SIZE - left); ++ ++ if ((ret = dump_ll_write(dump_config.dumper->dump_buf, ++ DUMP_BUFFER_SIZE)) < DUMP_BUFFER_SIZE) { ++ return (ret < 0) ? ret : -ENOSPC; ++ } ++ ++ dump_config.dumper->curr_offset += DUMP_BUFFER_SIZE; ++ ++ if (left > DUMP_BUFFER_SIZE) { ++ left -= DUMP_BUFFER_SIZE; ++ memcpy(dump_config.dumper->dump_buf, ++ dump_config.dumper->dump_buf + DUMP_BUFFER_SIZE, left); ++ dump_config.dumper->curr_buf -= DUMP_BUFFER_SIZE; ++ } else { ++ left = 0; ++ } ++ } ++ return 0; ++} ++ ++ ++/* Default Formatter (lcrash) */ ++struct dump_fmt_ops dump_fmt_lcrash_ops = { ++ .configure_header = dump_lcrash_configure_header, ++ .update_header = dump_generic_update_header, ++ .save_context = dump_lcrash_save_context, ++ .add_data = dump_lcrash_add_data, ++ .update_end_marker = dump_lcrash_update_end_marker ++}; ++ ++struct dump_fmt dump_fmt_lcrash = { ++ .name = "lcrash", ++ .ops = &dump_fmt_lcrash_ops ++}; ++ +--- linux-2.5.69/drivers/dump/dump_gzip.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_gzip.c Fri Dec 13 00:51:31 2002 +@@ -0,0 +1,118 @@ ++/* ++ * GZIP Compression functions for kernel crash dumps. ++ * ++ * Created by: Matt Robinson (yakker@sourceforge.net) ++ * Copyright 2001 Matt D. Robinson. All rights reserved. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* header files */ ++#include <linux/config.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/file.h> ++#include <linux/init.h> ++#include <linux/slab.h> ++#include <linux/dump.h> ++#include <linux/zlib.h> ++#include <linux/vmalloc.h> ++ ++static void *deflate_workspace; ++ ++/* ++ * Name: dump_compress_gzip() ++ * Func: Compress a DUMP_PAGE_SIZE page using gzip-style algorithms (the. ++ * deflate functions similar to what's used in PPP). ++ */ ++static u16 ++dump_compress_gzip(const u8 *old, u16 oldsize, u8 *new, u16 newsize) ++{ ++ /* error code and dump stream */ ++ int err; ++ z_stream dump_stream; ++ ++ dump_stream.workspace = deflate_workspace; ++ ++ if ((err = zlib_deflateInit(&dump_stream, Z_BEST_COMPRESSION)) != Z_OK) { ++ /* fall back to RLE compression */ ++ printk("dump_compress_gzip(): zlib_deflateInit() " ++ "failed (%d)!\n", err); ++ return 0; ++ } ++ ++ /* use old (page of memory) and size (DUMP_PAGE_SIZE) as in-streams */ ++ dump_stream.next_in = (u8 *) old; ++ dump_stream.avail_in = oldsize; ++ ++ /* out streams are new (dpcpage) and new size (DUMP_DPC_PAGE_SIZE) */ ++ dump_stream.next_out = new; ++ dump_stream.avail_out = newsize; ++ ++ /* deflate the page -- check for error */ ++ err = zlib_deflate(&dump_stream, Z_FINISH); ++ if (err != Z_STREAM_END) { ++ /* zero is return code here */ ++ (void)zlib_deflateEnd(&dump_stream); ++ printk("dump_compress_gzip(): zlib_deflate() failed (%d)!\n", ++ err); ++ return 0; ++ } ++ ++ /* let's end the deflated compression stream */ ++ if ((err = zlib_deflateEnd(&dump_stream)) != Z_OK) { ++ printk("dump_compress_gzip(): zlib_deflateEnd() " ++ "failed (%d)!\n", err); ++ } ++ ++ /* return the compressed byte total (if it's smaller) */ ++ if (dump_stream.total_out >= oldsize) { ++ return oldsize; ++ } ++ return dump_stream.total_out; ++} ++ ++/* setup the gzip compression functionality */ ++static struct __dump_compress dump_gzip_compression = { ++ .compress_type = DUMP_COMPRESS_GZIP, ++ .compress_func = dump_compress_gzip, ++ .compress_name = "GZIP", ++}; ++ ++/* ++ * Name: dump_compress_gzip_init() ++ * Func: Initialize gzip as a compression mechanism. ++ */ ++static int __init ++dump_compress_gzip_init(void) ++{ ++ deflate_workspace = vmalloc(zlib_deflate_workspacesize()); ++ if (!deflate_workspace) { ++ printk("dump_compress_gzip_init(): Failed to " ++ "alloc %d bytes for deflate workspace\n", ++ zlib_deflate_workspacesize()); ++ return -ENOMEM; ++ } ++ dump_register_compression(&dump_gzip_compression); ++ return 0; ++} ++ ++/* ++ * Name: dump_compress_gzip_cleanup() ++ * Func: Remove gzip as a compression mechanism. ++ */ ++static void __exit ++dump_compress_gzip_cleanup(void) ++{ ++ vfree(deflate_workspace); ++ dump_unregister_compression(DUMP_COMPRESS_GZIP); ++} ++ ++/* module initialization */ ++module_init(dump_compress_gzip_init); ++module_exit(dump_compress_gzip_cleanup); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>"); ++MODULE_DESCRIPTION("Gzip compression module for crash dump driver"); +--- linux-2.5.69/drivers/dump/dump_i386.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_i386.c Wed Mar 5 02:49:22 2003 +@@ -0,0 +1,329 @@ ++/* ++ * Architecture specific (i386) functions for Linux crash dumps. ++ * ++ * Created by: Matt Robinson (yakker@sgi.com) ++ * ++ * Copyright 1999 Silicon Graphics, Inc. All rights reserved. ++ * ++ * 2.3 kernel modifications by: Matt D. Robinson (yakker@turbolinux.com) ++ * Copyright 2000 TurboLinux, Inc. All rights reserved. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* ++ * The hooks for dumping the kernel virtual memory to disk are in this ++ * file. Any time a modification is made to the virtual memory mechanism, ++ * these routines must be changed to use the new mechanisms. ++ */ ++#include <linux/init.h> ++#include <linux/types.h> ++#include <linux/kernel.h> ++#include <linux/smp.h> ++#include <linux/fs.h> ++#include <linux/vmalloc.h> ++#include <linux/mm.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++#include <linux/irq.h> ++ ++#include <asm/processor.h> ++#include <asm/e820.h> ++#include <asm/hardirq.h> ++#include <asm/nmi.h> ++ ++static __s32 saved_irq_count; /* saved preempt_count() flags */ ++ ++static int ++alloc_dha_stack(void) ++{ ++ int i; ++ void *ptr; ++ ++ if (dump_header_asm.dha_stack[0]) ++ return 0; ++ ++ ptr = vmalloc(THREAD_SIZE * num_online_cpus()); ++ if (!ptr) { ++ printk("vmalloc for dha_stacks failed\n"); ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < num_online_cpus(); i++) { ++ dump_header_asm.dha_stack[i] = (u32)((unsigned long)ptr + ++ (i * THREAD_SIZE)); ++ } ++ return 0; ++} ++ ++static int ++free_dha_stack(void) ++{ ++ if (dump_header_asm.dha_stack[0]) { ++ vfree((void *)dump_header_asm.dha_stack[0]); ++ dump_header_asm.dha_stack[0] = 0; ++ } ++ return 0; ++} ++ ++ ++void ++__dump_save_regs(struct pt_regs *dest_regs, const struct pt_regs *regs) ++{ ++ *dest_regs = *regs; ++ ++ /* In case of panic dumps, we collects regs on entry to panic. ++ * so, we shouldn't 'fix' ssesp here again. But it is hard to ++ * tell just looking at regs whether ssesp need fixing. We make ++ * this decision by looking at xss in regs. If we have better ++ * means to determine that ssesp are valid (by some flag which ++ * tells that we are here due to panic dump), then we can use ++ * that instead of this kludge. ++ */ ++ if (!user_mode(regs)) { ++ if ((0xffff & regs->xss) == __KERNEL_DS) ++ /* already fixed up */ ++ return; ++ dest_regs->esp = (unsigned long)&(regs->esp); ++ __asm__ __volatile__ ("movw %%ss, %%ax;" ++ :"=a"(dest_regs->xss)); ++ } ++} ++ ++ ++#ifdef CONFIG_SMP ++extern unsigned long irq_affinity[]; ++extern irq_desc_t irq_desc[]; ++extern void dump_send_ipi(void); ++ ++static int dump_expect_ipi[NR_CPUS]; ++static atomic_t waiting_for_dump_ipi; ++static unsigned long saved_affinity[NR_IRQS]; ++ ++extern void stop_this_cpu(void *); /* exported by i386 kernel */ ++ ++static int ++dump_nmi_callback(struct pt_regs *regs, int cpu) ++{ ++ if (!dump_expect_ipi[cpu]) ++ return 0; ++ ++ dump_expect_ipi[cpu] = 0; ++ ++ dump_save_this_cpu(regs); ++ atomic_dec(&waiting_for_dump_ipi); ++ ++ level_changed: ++ switch (dump_silence_level) { ++ case DUMP_HARD_SPIN_CPUS: /* Spin until dump is complete */ ++ while (dump_oncpu) { ++ barrier(); /* paranoia */ ++ if (dump_silence_level != DUMP_HARD_SPIN_CPUS) ++ goto level_changed; ++ ++ cpu_relax(); /* kill time nicely */ ++ } ++ break; ++ ++ case DUMP_HALT_CPUS: /* Execute halt */ ++ stop_this_cpu(NULL); ++ break; ++ ++ case DUMP_SOFT_SPIN_CPUS: ++ /* Mark the task so it spins in schedule */ ++ set_tsk_thread_flag(current, TIF_NEED_RESCHED); ++ break; ++ } ++ ++ return 1; ++} ++ ++/* save registers on other processors */ ++void ++__dump_save_other_cpus(void) ++{ ++ int i, cpu = smp_processor_id(); ++ int other_cpus = num_online_cpus()-1; ++ ++ if (other_cpus > 0) { ++ atomic_set(&waiting_for_dump_ipi, other_cpus); ++ ++ for (i = 0; i < NR_CPUS; i++) { ++ dump_expect_ipi[i] = (i != cpu && cpu_online(i)); ++ } ++ ++ /* short circuit normal NMI handling temporarily */ ++ set_nmi_callback(dump_nmi_callback); ++ wmb(); ++ ++ dump_send_ipi(); ++ /* may be we dont need to wait for NMI to be processed. ++ just write out the header at the end of dumping, if ++ this IPI is not processed until then, there probably ++ is a problem and we just fail to capture state of ++ other cpus. */ ++ while(atomic_read(&waiting_for_dump_ipi) > 0) { ++ cpu_relax(); ++ } ++ ++ unset_nmi_callback(); ++ } ++} ++ ++/* ++ * Routine to save the old irq affinities and change affinities of all irqs to ++ * the dumping cpu. ++ */ ++static void ++set_irq_affinity(void) ++{ ++ int i; ++ int cpu = smp_processor_id(); ++ ++ memcpy(saved_affinity, irq_affinity, NR_IRQS * sizeof(unsigned long)); ++ for (i = 0; i < NR_IRQS; i++) { ++ if (irq_desc[i].handler == NULL) ++ continue; ++ irq_affinity[i] = 1UL << cpu; ++ if (irq_desc[i].handler->set_affinity != NULL) ++ irq_desc[i].handler->set_affinity(i, irq_affinity[i]); ++ } ++} ++ ++/* ++ * Restore old irq affinities. ++ */ ++static void ++reset_irq_affinity(void) ++{ ++ int i; ++ ++ memcpy(irq_affinity, saved_affinity, NR_IRQS * sizeof(unsigned long)); ++ for (i = 0; i < NR_IRQS; i++) { ++ if (irq_desc[i].handler == NULL) ++ continue; ++ if (irq_desc[i].handler->set_affinity != NULL) ++ irq_desc[i].handler->set_affinity(i, saved_affinity[i]); ++ } ++} ++ ++#else /* !CONFIG_SMP */ ++#define set_irq_affinity() do { } while (0) ++#define reset_irq_affinity() do { } while (0) ++#define save_other_cpu_states() do { } while (0) ++#endif /* !CONFIG_SMP */ ++ ++/* ++ * Kludge - dump from interrupt context is unreliable (Fixme) ++ * ++ * We do this so that softirqs initiated for dump i/o ++ * get processed and we don't hang while waiting for i/o ++ * to complete or in any irq synchronization attempt. ++ * ++ * This is not quite legal of course, as it has the side ++ * effect of making all interrupts & softirqs triggered ++ * while dump is in progress complete before currently ++ * pending softirqs and the currently executing interrupt ++ * code. ++ */ ++static inline void ++irq_bh_save(void) ++{ ++ saved_irq_count = irq_count(); ++ preempt_count() &= ~(HARDIRQ_MASK|SOFTIRQ_MASK); ++} ++ ++static inline void ++irq_bh_restore(void) ++{ ++ preempt_count() |= saved_irq_count; ++} ++ ++/* ++ * Name: __dump_irq_enable ++ * Func: Reset system so interrupts are enabled. ++ * This is used for dump methods that require interrupts ++ * Eventually, all methods will have interrupts disabled ++ * and this code can be removed. ++ * ++ * Change irq affinities ++ * Re-enable interrupts ++ */ ++void ++__dump_irq_enable(void) ++{ ++ set_irq_affinity(); ++ irq_bh_save(); ++ local_irq_enable(); ++} ++ ++/* ++ * Name: __dump_irq_restore ++ * Func: Resume the system state in an architecture-specific way. ++ ++ */ ++void ++__dump_irq_restore(void) ++{ ++ local_irq_disable(); ++ reset_irq_affinity(); ++ irq_bh_restore(); ++} ++ ++/* ++ * Name: __dump_configure_header() ++ * Func: Meant to fill in arch specific header fields except per-cpu state ++ * already captured via __dump_save_context for all CPUs. ++ */ ++int ++__dump_configure_header(const struct pt_regs *regs) ++{ ++ return (0); ++} ++ ++/* ++ * Name: __dump_init() ++ * Func: Initialize the dumping routine process. ++ */ ++void ++__dump_init(uint64_t local_memory_start) ++{ ++ return; ++} ++ ++/* ++ * Name: __dump_open() ++ * Func: Open the dump device (architecture specific). ++ */ ++void ++__dump_open(void) ++{ ++ alloc_dha_stack(); ++} ++ ++/* ++ * Name: __dump_cleanup() ++ * Func: Free any architecture specific data structures. This is called ++ * when the dump module is being removed. ++ */ ++void ++__dump_cleanup(void) ++{ ++ free_dha_stack(); ++} ++ ++extern int pfn_is_ram(unsigned long); ++ ++/* ++ * Name: __dump_page_valid() ++ * Func: Check if page is valid to dump. ++ */ ++int ++__dump_page_valid(unsigned long index) ++{ ++ if (!pfn_valid(index)) ++ return 0; ++ ++ return pfn_is_ram(index); ++} ++ +--- linux-2.5.69/drivers/dump/dump_memdev.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_memdev.c Tue Mar 25 21:34:35 2003 +@@ -0,0 +1,640 @@ ++/* ++ * Implements the dump driver interface for saving a dump in available ++ * memory areas. The saved pages may be written out to persistent storage ++ * after a soft reboot. ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ * ++ * The approach of tracking pages containing saved dump using map pages ++ * allocated as needed has been derived from the Mission Critical Linux ++ * mcore dump implementation. ++ * ++ * Credits and a big thanks for letting the lkcd project make use of ++ * the excellent piece of work and also helping with clarifications ++ * and tips along the way are due to: ++ * Dave Winchell <winchell@mclx.com> (primary author of mcore) ++ * Jeff Moyer <moyer@mclx.com> ++ * Josh Huber <huber@mclx.com> ++ * ++ * For those familiar with the mcore code, the main differences worth ++ * noting here (besides the dump device abstraction) result from enabling ++ * "high" memory pages (pages not permanently mapped in the kernel ++ * address space) to be used for saving dump data (because of which a ++ * simple virtual address based linked list cannot be used anymore for ++ * managing free pages), an added level of indirection for faster ++ * lookups during the post-boot stage, and the idea of pages being ++ * made available as they get freed up while dump to memory progresses ++ * rather than one time before starting the dump. The last point enables ++ * a full memory snapshot to be saved starting with an initial set of ++ * bootstrap pages given a good compression ratio. (See dump_overlay.c) ++ * ++ */ ++ ++/* ++ * -----------------MEMORY LAYOUT ------------------ ++ * The memory space consists of a set of discontiguous pages, and ++ * discontiguous map pages as well, rooted in a chain of indirect ++ * map pages (also discontiguous). Except for the indirect maps ++ * (which must be preallocated in advance), the rest of the pages ++ * could be in high memory. ++ * ++ * root ++ * | --------- -------- -------- ++ * --> | . . +|--->| . +|------->| . . | indirect ++ * --|--|--- ---|---- --|-|--- maps ++ * | | | | | ++ * ------ ------ ------- ------ ------- ++ * | . | | . | | . . | | . | | . . | maps ++ * --|--- --|--- --|--|-- --|--- ---|-|-- ++ * page page page page page page page data ++ * pages ++ * ++ * Writes to the dump device happen sequentially in append mode. ++ * The main reason for the existence of the indirect map is ++ * to enable a quick way to lookup a specific logical offset in ++ * the saved data post-soft-boot, e.g. to writeout pages ++ * with more critical data first, even though such pages ++ * would have been compressed and copied last, being the lowest ++ * ranked candidates for reuse due to their criticality. ++ * (See dump_overlay.c) ++ */ ++#include <linux/mm.h> ++#include <linux/highmem.h> ++#include <linux/bootmem.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++#define DUMP_MAP_SZ (PAGE_SIZE / sizeof(unsigned long)) /* direct map size */ ++#define DUMP_IND_MAP_SZ DUMP_MAP_SZ - 1 /* indirect map size */ ++#define DUMP_NR_BOOTSTRAP 64 /* no of bootstrap pages */ ++ ++extern int dump_low_page(struct page *); ++ ++/* check if the next entry crosses a page boundary */ ++static inline int is_last_map_entry(unsigned long *map) ++{ ++ unsigned long addr = (unsigned long)(map + 1); ++ ++ return (!(addr & (PAGE_SIZE - 1))); ++} ++ ++/* Todo: should have some validation checks */ ++/* The last entry in the indirect map points to the next indirect map */ ++/* Indirect maps are referred to directly by virtual address */ ++static inline unsigned long *next_indirect_map(unsigned long *map) ++{ ++ return (unsigned long *)map[DUMP_IND_MAP_SZ]; ++} ++ ++#ifdef CONFIG_CRASH_DUMP_SOFTBOOT ++/* Called during early bootup - fixme: make this __init */ ++void dump_early_reserve_map(struct dump_memdev *dev) ++{ ++ unsigned long *map1, *map2; ++ loff_t off = 0, last = dev->last_used_offset >> PAGE_SHIFT; ++ int i, j; ++ ++ printk("Reserve bootmap space holding previous dump of %lld pages\n", ++ last); ++ map1= (unsigned long *)dev->indirect_map_root; ++ ++ while (map1 && (off < last)) { ++ reserve_bootmem(virt_to_phys((void *)map1), PAGE_SIZE); ++ for (i=0; (i < DUMP_MAP_SZ - 1) && map1[i] && (off < last); ++ i++, off += DUMP_MAP_SZ) { ++ pr_debug("indirect map[%d] = 0x%lx\n", i, map1[i]); ++ if (map1[i] >= max_low_pfn) ++ continue; ++ reserve_bootmem(map1[i] << PAGE_SHIFT, PAGE_SIZE); ++ map2 = pfn_to_kaddr(map1[i]); ++ for (j = 0 ; (j < DUMP_MAP_SZ) && map2[j] && ++ (off + j < last); j++) { ++ pr_debug("\t map[%d][%d] = 0x%lx\n", i, j, ++ map2[j]); ++ if (map2[j] < max_low_pfn) { ++ reserve_bootmem(map2[j] << PAGE_SHIFT, ++ PAGE_SIZE); ++ } ++ } ++ } ++ map1 = next_indirect_map(map1); ++ } ++ dev->nr_free = 0; /* these pages don't belong to this boot */ ++} ++#endif ++ ++/* mark dump pages so that they aren't used by this kernel */ ++void dump_mark_map(struct dump_memdev *dev) ++{ ++ unsigned long *map1, *map2; ++ loff_t off = 0, last = dev->last_used_offset >> PAGE_SHIFT; ++ struct page *page; ++ int i, j; ++ ++ printk("Dump: marking pages in use by previous dump\n"); ++ map1= (unsigned long *)dev->indirect_map_root; ++ ++ while (map1 && (off < last)) { ++ page = virt_to_page(map1); ++ set_page_count(page, 1); ++ for (i=0; (i < DUMP_MAP_SZ - 1) && map1[i] && (off < last); ++ i++, off += DUMP_MAP_SZ) { ++ pr_debug("indirect map[%d] = 0x%lx\n", i, map1[i]); ++ page = pfn_to_page(map1[i]); ++ set_page_count(page, 1); ++ map2 = kmap_atomic(page, KM_DUMP); ++ for (j = 0 ; (j < DUMP_MAP_SZ) && map2[j] && ++ (off + j < last); j++) { ++ pr_debug("\t map[%d][%d] = 0x%lx\n", i, j, ++ map2[j]); ++ page = pfn_to_page(map2[j]); ++ set_page_count(page, 1); ++ } ++ } ++ map1 = next_indirect_map(map1); ++ } ++} ++ ++ ++/* ++ * Given a logical offset into the mem device lookup the ++ * corresponding page ++ * loc is specified in units of pages ++ * Note: affects curr_map (even in the case where lookup fails) ++ */ ++struct page *dump_mem_lookup(struct dump_memdev *dump_mdev, unsigned long loc) ++{ ++ unsigned long *map; ++ unsigned long i, index = loc / DUMP_MAP_SZ; ++ struct page *page = NULL; ++ unsigned long curr_pfn, curr_map, *curr_map_ptr = NULL; ++ ++ map = (unsigned long *)dump_mdev->indirect_map_root; ++ if (!map) ++ return NULL; ++ ++ if (loc > dump_mdev->last_offset >> PAGE_SHIFT) ++ return NULL; ++ ++ /* ++ * first locate the right indirect map ++ * in the chain of indirect maps ++ */ ++ for (i = 0; i + DUMP_IND_MAP_SZ < index ; i += DUMP_IND_MAP_SZ) { ++ if (!(map = next_indirect_map(map))) ++ return NULL; ++ } ++ /* then the right direct map */ ++ /* map entries are referred to by page index */ ++ if ((curr_map = map[index - i])) { ++ page = pfn_to_page(curr_map); ++ /* update the current traversal index */ ++ /* dump_mdev->curr_map = &map[index - i];*/ ++ curr_map_ptr = &map[index - i]; ++ } ++ ++ if (page) ++ map = kmap_atomic(page, KM_DUMP); ++ else ++ return NULL; ++ ++ /* and finally the right entry therein */ ++ /* data pages are referred to by page index */ ++ i = index * DUMP_MAP_SZ; ++ if ((curr_pfn = map[loc - i])) { ++ page = pfn_to_page(curr_pfn); ++ dump_mdev->curr_map = curr_map_ptr; ++ dump_mdev->curr_map_offset = loc - i; ++ dump_mdev->ddev.curr_offset = loc << PAGE_SHIFT; ++ } else { ++ page = NULL; ++ } ++ kunmap_atomic(map, KM_DUMP); ++ ++ return page; ++} ++ ++/* ++ * Retrieves a pointer to the next page in the dump device ++ * Used during the lookup pass post-soft-reboot ++ */ ++struct page *dump_mem_next_page(struct dump_memdev *dev) ++{ ++ unsigned long i; ++ unsigned long *map; ++ struct page *page = NULL; ++ ++ if (dev->ddev.curr_offset + PAGE_SIZE >= dev->last_offset) { ++ return NULL; ++ } ++ ++ if ((i = (unsigned long)(++dev->curr_map_offset)) >= DUMP_MAP_SZ) { ++ /* move to next map */ ++ if (is_last_map_entry(++dev->curr_map)) { ++ /* move to the next indirect map page */ ++ printk("dump_mem_next_page: go to next indirect map\n"); ++ dev->curr_map = (unsigned long *)*dev->curr_map; ++ if (!dev->curr_map) ++ return NULL; ++ } ++ i = dev->curr_map_offset = 0; ++ pr_debug("dump_mem_next_page: next map 0x%lx, entry 0x%lx\n", ++ dev->curr_map, *dev->curr_map); ++ ++ }; ++ ++ if (*dev->curr_map) { ++ map = kmap_atomic(pfn_to_page(*dev->curr_map), KM_DUMP); ++ if (map[i]) ++ page = pfn_to_page(map[i]); ++ kunmap_atomic(map, KM_DUMP); ++ dev->ddev.curr_offset += PAGE_SIZE; ++ }; ++ ++ return page; ++} ++ ++/* Copied from dump_filters.c */ ++static inline int kernel_page(struct page *p) ++{ ++ /* FIXME: Need to exclude hugetlb pages. Clue: reserved but inuse */ ++ return PageReserved(p) || (!PageLRU(p) && PageInuse(p)); ++} ++ ++static inline int user_page(struct page *p) ++{ ++ return PageInuse(p) && (!PageReserved(p) && PageLRU(p)); ++} ++ ++int dump_reused_by_boot(struct page *page) ++{ ++ /* Todo ++ * Checks: ++ * if PageReserved ++ * if < __end + bootmem_bootmap_pages for this boot + allowance ++ * if overwritten by initrd (how to check ?) ++ * Also, add more checks in early boot code ++ * e.g. bootmem bootmap alloc verify not overwriting dump, and if ++ * so then realloc or move the dump pages out accordingly. ++ */ ++ ++ /* Temporary proof of concept hack, avoid overwriting kern pages */ ++ ++ return (kernel_page(page) || dump_low_page(page) || user_page(page)); ++} ++ ++ ++/* Uses the free page passed in to expand available space */ ++int dump_mem_add_space(struct dump_memdev *dev, struct page *page) ++{ ++ struct page *map_page; ++ unsigned long *map; ++ unsigned long i; ++ ++ if (!dev->curr_map) ++ return -ENOMEM; /* must've exhausted indirect map */ ++ ++ if (!*dev->curr_map || dev->curr_map_offset >= DUMP_MAP_SZ) { ++ /* add map space */ ++ *dev->curr_map = page_to_pfn(page); ++ dev->curr_map_offset = 0; ++ return 0; ++ } ++ ++ /* add data space */ ++ i = dev->curr_map_offset; ++ map_page = pfn_to_page(*dev->curr_map); ++ map = (unsigned long *)kmap_atomic(map_page, KM_DUMP); ++ map[i] = page_to_pfn(page); ++ kunmap_atomic(map, KM_DUMP); ++ dev->curr_map_offset = ++i; ++ dev->last_offset += PAGE_SIZE; ++ if (i >= DUMP_MAP_SZ) { ++ /* move to next map */ ++ if (is_last_map_entry(++dev->curr_map)) { ++ /* move to the next indirect map page */ ++ pr_debug("dump_mem_add_space: using next" ++ "indirect map\n"); ++ dev->curr_map = (unsigned long *)*dev->curr_map; ++ } ++ } ++ return 0; ++} ++ ++ ++/* Caution: making a dest page invalidates existing contents of the page */ ++int dump_check_and_free_page(struct dump_memdev *dev, struct page *page) ++{ ++ int err = 0; ++ ++ /* ++ * the page can be used as a destination only if we are sure ++ * it won't get overwritten by the soft-boot, and is not ++ * critical for us right now. ++ */ ++ if (dump_reused_by_boot(page)) ++ return 0; ++ ++ if ((err = dump_mem_add_space(dev, page))) { ++ printk("Warning: Unable to extend memdev space. Err %d\n", ++ err); ++ return 0; ++ } ++ ++ dev->nr_free++; ++ return 1; ++} ++ ++ ++/* Set up the initial maps and bootstrap space */ ++/* Must be called only after any previous dump is written out */ ++int dump_mem_open(struct dump_dev *dev, unsigned long devid) ++{ ++ struct dump_memdev *dump_mdev = DUMP_MDEV(dev); ++ unsigned long nr_maps, *map, *prev_map = &dump_mdev->indirect_map_root; ++ void *addr; ++ struct page *page; ++ unsigned long i = 0; ++ int err = 0; ++ ++ /* Todo: sanity check for unwritten previous dump */ ++ ++ /* allocate pages for indirect map (non highmem area) */ ++ nr_maps = num_physpages / DUMP_MAP_SZ; /* maps to cover entire mem */ ++ for (i = 0; i < nr_maps; i += DUMP_IND_MAP_SZ) { ++ if (!(map = (unsigned long *)dump_alloc_mem(PAGE_SIZE))) { ++ printk("Unable to alloc indirect map %ld\n", ++ i / DUMP_IND_MAP_SZ); ++ return -ENOMEM; ++ } ++ clear_page(map); ++ *prev_map = (unsigned long)map; ++ prev_map = &map[DUMP_IND_MAP_SZ]; ++ }; ++ ++ dump_mdev->curr_map = (unsigned long *)dump_mdev->indirect_map_root; ++ dump_mdev->curr_map_offset = 0; ++ ++ /* ++ * allocate a few bootstrap pages: at least 1 map and 1 data page ++ * plus enough to save the dump header ++ */ ++ i = 0; ++ do { ++ if (!(addr = dump_alloc_mem(PAGE_SIZE))) { ++ printk("Unable to alloc bootstrap page %ld\n", i); ++ return -ENOMEM; ++ } ++ ++ page = virt_to_page(addr); ++ if (dump_low_page(page)) { ++ dump_free_mem(addr); ++ continue; ++ } ++ ++ if (dump_mem_add_space(dump_mdev, page)) { ++ printk("Warning: Unable to extend memdev " ++ "space. Err %d\n", err); ++ dump_free_mem(addr); ++ continue; ++ } ++ i++; ++ } while (i < DUMP_NR_BOOTSTRAP); ++ ++ printk("dump memdev init: %ld maps, %ld bootstrap pgs, %ld free pgs\n", ++ nr_maps, i, dump_mdev->last_offset >> PAGE_SHIFT); ++ ++ dump_mdev->last_bs_offset = dump_mdev->last_offset; ++ ++ return 0; ++} ++ ++/* Releases all pre-alloc'd pages */ ++int dump_mem_release(struct dump_dev *dev) ++{ ++ struct dump_memdev *dump_mdev = DUMP_MDEV(dev); ++ struct page *page, *map_page; ++ unsigned long *map, *prev_map; ++ void *addr; ++ int i; ++ ++ if (!dump_mdev->nr_free) ++ return 0; ++ ++ pr_debug("dump_mem_release\n"); ++ page = dump_mem_lookup(dump_mdev, 0); ++ for (i = 0; page && (i < DUMP_NR_BOOTSTRAP - 1); i++) { ++ if (PageHighMem(page)) ++ break; ++ addr = page_address(page); ++ if (!addr) { ++ printk("page_address(%p) = NULL\n", page); ++ break; ++ } ++ pr_debug("Freeing page at 0x%lx\n", addr); ++ dump_free_mem(addr); ++ if (dump_mdev->curr_map_offset >= DUMP_MAP_SZ - 1) { ++ map_page = pfn_to_page(*dump_mdev->curr_map); ++ if (PageHighMem(map_page)) ++ break; ++ page = dump_mem_next_page(dump_mdev); ++ addr = page_address(map_page); ++ if (!addr) { ++ printk("page_address(%p) = NULL\n", ++ map_page); ++ break; ++ } ++ pr_debug("Freeing map page at 0x%lx\n", addr); ++ dump_free_mem(addr); ++ i++; ++ } else { ++ page = dump_mem_next_page(dump_mdev); ++ } ++ } ++ ++ /* now for the last used bootstrap page used as a map page */ ++ if ((i < DUMP_NR_BOOTSTRAP) && (*dump_mdev->curr_map)) { ++ map_page = pfn_to_page(*dump_mdev->curr_map); ++ if ((map_page) && !PageHighMem(map_page)) { ++ addr = page_address(map_page); ++ if (!addr) { ++ printk("page_address(%p) = NULL\n", map_page); ++ } else { ++ pr_debug("Freeing map page at 0x%lx\n", addr); ++ dump_free_mem(addr); ++ i++; ++ } ++ } ++ } ++ ++ printk("Freed %d bootstrap pages\n", i); ++ ++ /* free the indirect maps */ ++ map = (unsigned long *)dump_mdev->indirect_map_root; ++ ++ i = 0; ++ while (map) { ++ prev_map = map; ++ map = next_indirect_map(map); ++ dump_free_mem(prev_map); ++ i++; ++ } ++ ++ printk("Freed %d indirect map(s)\n", i); ++ ++ /* Reset the indirect map */ ++ dump_mdev->indirect_map_root = 0; ++ dump_mdev->curr_map = 0; ++ ++ /* Reset the free list */ ++ dump_mdev->nr_free = 0; ++ ++ dump_mdev->last_offset = dump_mdev->ddev.curr_offset = 0; ++ dump_mdev->last_used_offset = 0; ++ dump_mdev->curr_map = NULL; ++ dump_mdev->curr_map_offset = 0; ++ return 0; ++} ++ ++/* ++ * Long term: ++ * It is critical for this to be very strict. Cannot afford ++ * to have anything running and accessing memory while we overwrite ++ * memory (potential risk of data corruption). ++ * If in doubt (e.g if a cpu is hung and not responding) just give ++ * up and refuse to proceed with this scheme. ++ * ++ * Note: I/O will only happen after soft-boot/switchover, so we can ++ * safely disable interrupts and force stop other CPUs if this is ++ * going to be a disruptive dump, no matter what they ++ * are in the middle of. ++ */ ++/* ++ * ATM Most of this is already taken care of in the nmi handler ++ * We may halt the cpus rightaway if we know this is going to be disruptive ++ * For now, since we've limited ourselves to overwriting free pages we ++ * aren't doing much here. Eventually, we'd have to wait to make sure other ++ * cpus aren't using memory we could be overwriting ++ */ ++int dump_mem_silence(struct dump_dev *dev) ++{ ++ struct dump_memdev *dump_mdev = DUMP_MDEV(dev); ++ ++ if (dump_mdev->last_offset > dump_mdev->last_bs_offset) { ++ /* prefer to run lkcd config & start with a clean slate */ ++ return -EEXIST; ++ } ++ return 0; ++} ++ ++extern int dump_overlay_resume(void); ++ ++/* Trigger the next stage of dumping */ ++int dump_mem_resume(struct dump_dev *dev) ++{ ++ dump_overlay_resume(); ++ return 0; ++} ++ ++/* ++ * Allocate mem dev pages as required and copy buffer contents into it. ++ * Fails if the no free pages are available ++ * Keeping it simple and limited for starters (can modify this over time) ++ * Does not handle holes or a sparse layout ++ * Data must be in multiples of PAGE_SIZE ++ */ ++int dump_mem_write(struct dump_dev *dev, void *buf, unsigned long len) ++{ ++ struct dump_memdev *dump_mdev = DUMP_MDEV(dev); ++ struct page *page; ++ unsigned long n = 0; ++ void *addr; ++ unsigned long *saved_curr_map, saved_map_offset; ++ int ret = 0; ++ ++ pr_debug("dump_mem_write: offset 0x%llx, size %ld\n", ++ dev->curr_offset, len); ++ ++ if (dev->curr_offset + len > dump_mdev->last_offset) { ++ printk("Out of space to write\n"); ++ return -ENOSPC; ++ } ++ ++ if ((len & (PAGE_SIZE - 1)) || (dev->curr_offset & (PAGE_SIZE - 1))) ++ return -EINVAL; /* not aligned in units of page size */ ++ ++ saved_curr_map = dump_mdev->curr_map; ++ saved_map_offset = dump_mdev->curr_map_offset; ++ page = dump_mem_lookup(dump_mdev, dev->curr_offset >> PAGE_SHIFT); ++ ++ for (n = len; (n > 0) && page; n -= PAGE_SIZE, buf += PAGE_SIZE ) { ++ addr = kmap_atomic(page, KM_DUMP); ++ /* memset(addr, 'x', PAGE_SIZE); */ ++ memcpy(addr, buf, PAGE_SIZE); ++ kunmap_atomic(addr, KM_DUMP); ++ /* dev->curr_offset += PAGE_SIZE; */ ++ page = dump_mem_next_page(dump_mdev); ++ } ++ ++ dump_mdev->curr_map = saved_curr_map; ++ dump_mdev->curr_map_offset = saved_map_offset; ++ ++ if (dump_mdev->last_used_offset < dev->curr_offset) ++ dump_mdev->last_used_offset = dev->curr_offset; ++ ++ return (len - n) ? (len - n) : ret ; ++} ++ ++/* dummy - always ready */ ++int dump_mem_ready(struct dump_dev *dev, void *buf) ++{ ++ return 0; ++} ++ ++/* ++ * Should check for availability of space to write upto the offset ++ * affects only the curr_offset; last_offset untouched ++ * Keep it simple: Only allow multiples of PAGE_SIZE for now ++ */ ++int dump_mem_seek(struct dump_dev *dev, loff_t offset) ++{ ++ struct dump_memdev *dump_mdev = DUMP_MDEV(dev); ++ ++ if (offset & (PAGE_SIZE - 1)) ++ return -EINVAL; /* allow page size units only for now */ ++ ++ /* Are we exceeding available space ? */ ++ if (offset > dump_mdev->last_offset) { ++ printk("dump_mem_seek failed for offset 0x%llx\n", ++ offset); ++ return -ENOSPC; ++ } ++ ++ dump_mdev->ddev.curr_offset = offset; ++ return 0; ++} ++ ++struct dump_dev_ops dump_memdev_ops = { ++ .open = dump_mem_open, ++ .release = dump_mem_release, ++ .silence = dump_mem_silence, ++ .resume = dump_mem_resume, ++ .seek = dump_mem_seek, ++ .write = dump_mem_write, ++ .read = NULL, /* not implemented at the moment */ ++ .ready = dump_mem_ready ++}; ++ ++static struct dump_memdev default_dump_memdev = { ++ .ddev = {.type_name = "memdev", .ops = &dump_memdev_ops, ++ .device_id = 0x14} ++ /* assume the rest of the fields are zeroed by default */ ++}; ++ ++/* may be overwritten if a previous dump exists */ ++struct dump_memdev *dump_memdev = &default_dump_memdev; ++ +--- linux-2.5.69/drivers/dump/dump_netdev.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_netdev.c Tue May 20 03:04:07 2003 +@@ -0,0 +1,863 @@ ++/* ++ * Implements the dump driver interface for saving a dump via network ++ * interface. ++ * ++ * Some of this code has been taken/adapted from Ingo Molnar's netconsole ++ * code. LKCD team expresses its thanks to Ingo. ++ * ++ * Started: June 2002 - Mohamed Abbas <mohamed.abbas@intel.com> ++ * Adapted netconsole code to implement LKCD dump over the network. ++ * ++ * Nov 2002 - Bharata B. Rao <bharata@in.ibm.com> ++ * Innumerable code cleanups, simplification and some fixes. ++ * Netdump configuration done by ioctl instead of using module parameters. ++ * ++ * Copyright (C) 2001 Ingo Molnar <mingo@redhat.com> ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++#include <net/tcp.h> ++#include <net/udp.h> ++#include <linux/delay.h> ++#include <linux/random.h> ++#include <linux/reboot.h> ++#include <linux/module.h> ++#include <linux/dump.h> ++#include <linux/dump_netdev.h> ++ ++#include <asm/unaligned.h> ++ ++static int startup_handshake; ++static int page_counter; ++static struct net_device *dump_ndev; ++static struct in_device *dump_in_dev; ++static u16 source_port, target_port; ++static u32 source_ip, target_ip; ++static unsigned char daddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ; ++static spinlock_t dump_skb_lock = SPIN_LOCK_UNLOCKED; ++static int dump_nr_skbs; ++static struct sk_buff *dump_skb; ++static unsigned long flags_global; ++static int netdump_in_progress; ++static char device_name[IFNAMSIZ]; ++ ++/* ++ * security depends on the trusted path between the netconsole ++ * server and netconsole client, since none of the packets are ++ * encrypted. The random magic number protects the protocol ++ * against spoofing. ++ */ ++static u64 dump_magic; ++ ++#define MAX_UDP_CHUNK 1460 ++#define MAX_PRINT_CHUNK (MAX_UDP_CHUNK-HEADER_LEN) ++ ++/* ++ * We maintain a small pool of fully-sized skbs, ++ * to make sure the message gets out even in ++ * extreme OOM situations. ++ */ ++#define DUMP_MAX_SKBS 32 ++ ++#define MAX_SKB_SIZE \ ++ (MAX_UDP_CHUNK + sizeof(struct udphdr) + \ ++ sizeof(struct iphdr) + sizeof(struct ethhdr)) ++ ++static void ++dump_refill_skbs(void) ++{ ++ struct sk_buff *skb; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dump_skb_lock, flags); ++ while (dump_nr_skbs < DUMP_MAX_SKBS) { ++ skb = alloc_skb(MAX_SKB_SIZE, GFP_ATOMIC); ++ if (!skb) ++ break; ++ if (dump_skb) ++ skb->next = dump_skb; ++ else ++ skb->next = NULL; ++ dump_skb = skb; ++ dump_nr_skbs++; ++ } ++ spin_unlock_irqrestore(&dump_skb_lock, flags); ++} ++ ++static struct ++sk_buff * dump_get_skb(void) ++{ ++ struct sk_buff *skb; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dump_skb_lock, flags); ++ skb = dump_skb; ++ if (skb) { ++ dump_skb = skb->next; ++ skb->next = NULL; ++ dump_nr_skbs--; ++ } ++ spin_unlock_irqrestore(&dump_skb_lock, flags); ++ ++ return skb; ++} ++ ++/* ++ * Zap completed output skbs. ++ */ ++static void ++zap_completion_queue(void) ++{ ++ int count; ++ unsigned long flags; ++ int cpu = smp_processor_id(); ++ ++ count=0; ++ if (softnet_data[cpu].completion_queue) { ++ struct sk_buff *clist; ++ ++ local_irq_save(flags); ++ clist = softnet_data[cpu].completion_queue; ++ softnet_data[cpu].completion_queue = NULL; ++ local_irq_restore(flags); ++ ++ while (clist != NULL) { ++ struct sk_buff *skb = clist; ++ clist = clist->next; ++ __kfree_skb(skb); ++ count++; ++ if (count > 10000) ++ printk("Error in sk list\n"); ++ } ++ } ++} ++ ++static void ++dump_send_skb(struct net_device *dev, const char *msg, unsigned int msg_len, ++ reply_t *reply) ++{ ++ int once = 1; ++ int total_len, eth_len, ip_len, udp_len, count = 0; ++ struct sk_buff *skb; ++ struct udphdr *udph; ++ struct iphdr *iph; ++ struct ethhdr *eth; ++ ++ udp_len = msg_len + HEADER_LEN + sizeof(*udph); ++ ip_len = eth_len = udp_len + sizeof(*iph); ++ total_len = eth_len + ETH_HLEN; ++ ++repeat_loop: ++ zap_completion_queue(); ++ if (dump_nr_skbs < DUMP_MAX_SKBS) ++ dump_refill_skbs(); ++ ++ skb = alloc_skb(total_len, GFP_ATOMIC); ++ if (!skb) { ++ skb = dump_get_skb(); ++ if (!skb) { ++ count++; ++ if (once && (count == 1000000)) { ++ printk("possibly FATAL: out of netconsole " ++ "skbs!!! will keep retrying.\n"); ++ once = 0; ++ } ++ dev->poll_controller(dev); ++ goto repeat_loop; ++ } ++ } ++ ++ atomic_set(&skb->users, 1); ++ skb_reserve(skb, total_len - msg_len - HEADER_LEN); ++ skb->data[0] = NETCONSOLE_VERSION; ++ ++ put_unaligned(htonl(reply->nr), (u32 *) (skb->data + 1)); ++ put_unaligned(htonl(reply->code), (u32 *) (skb->data + 5)); ++ put_unaligned(htonl(reply->info), (u32 *) (skb->data + 9)); ++ ++ memcpy(skb->data + HEADER_LEN, msg, msg_len); ++ skb->len += msg_len + HEADER_LEN; ++ ++ udph = (struct udphdr *) skb_push(skb, sizeof(*udph)); ++ udph->source = source_port; ++ udph->dest = target_port; ++ udph->len = htons(udp_len); ++ udph->check = 0; ++ ++ iph = (struct iphdr *)skb_push(skb, sizeof(*iph)); ++ ++ iph->version = 4; ++ iph->ihl = 5; ++ iph->tos = 0; ++ iph->tot_len = htons(ip_len); ++ iph->id = 0; ++ iph->frag_off = 0; ++ iph->ttl = 64; ++ iph->protocol = IPPROTO_UDP; ++ iph->check = 0; ++ iph->saddr = source_ip; ++ iph->daddr = target_ip; ++ iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); ++ ++ eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); ++ ++ eth->h_proto = htons(ETH_P_IP); ++ memcpy(eth->h_source, dev->dev_addr, dev->addr_len); ++ memcpy(eth->h_dest, daddr, dev->addr_len); ++ ++ count=0; ++repeat_poll: ++ spin_lock(&dev->xmit_lock); ++ dev->xmit_lock_owner = smp_processor_id(); ++ ++ count++; ++ ++ ++ if (netif_queue_stopped(dev)) { ++ dev->xmit_lock_owner = -1; ++ spin_unlock(&dev->xmit_lock); ++ ++ dev->poll_controller(dev); ++ zap_completion_queue(); ++ ++ ++ goto repeat_poll; ++ } ++ ++ dev->hard_start_xmit(skb, dev); ++ ++ dev->xmit_lock_owner = -1; ++ spin_unlock(&dev->xmit_lock); ++} ++ ++static unsigned short ++udp_check(struct udphdr *uh, int len, unsigned long saddr, unsigned long daddr, ++ unsigned long base) ++{ ++ return csum_tcpudp_magic(saddr, daddr, len, IPPROTO_UDP, base); ++} ++ ++static int ++udp_checksum_init(struct sk_buff *skb, struct udphdr *uh, ++ unsigned short ulen, u32 saddr, u32 daddr) ++{ ++ if (uh->check == 0) { ++ skb->ip_summed = CHECKSUM_UNNECESSARY; ++ } else if (skb->ip_summed == CHECKSUM_HW) { ++ skb->ip_summed = CHECKSUM_UNNECESSARY; ++ if (!udp_check(uh, ulen, saddr, daddr, skb->csum)) ++ return 0; ++ skb->ip_summed = CHECKSUM_NONE; ++ } ++ if (skb->ip_summed != CHECKSUM_UNNECESSARY) ++ skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen, ++ IPPROTO_UDP, 0); ++ /* Probably, we should checksum udp header (it should be in cache ++ * in any case) and data in tiny packets (< rx copybreak). ++ */ ++ return 0; ++} ++ ++static __inline__ int ++__udp_checksum_complete(struct sk_buff *skb) ++{ ++ return (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, ++ skb->csum)); ++} ++ ++static __inline__ ++int udp_checksum_complete(struct sk_buff *skb) ++{ ++ return skb->ip_summed != CHECKSUM_UNNECESSARY && ++ __udp_checksum_complete(skb); ++} ++ ++int new_req = 0; ++static req_t req; ++ ++static int ++dump_rx_hook(struct sk_buff *skb) ++{ ++ int proto; ++ struct iphdr *iph; ++ struct udphdr *uh; ++ __u32 len, saddr, daddr, ulen; ++ req_t *__req; ++ ++ /* ++ * First check if were are dumping or doing startup handshake, if ++ * not quickly return. ++ */ ++ if (!netdump_in_progress) ++ return NET_RX_SUCCESS; ++ ++ if (skb->dev->type != ARPHRD_ETHER) ++ goto out; ++ ++ proto = ntohs(skb->mac.ethernet->h_proto); ++ if (proto != ETH_P_IP) ++ goto out; ++ ++ if (skb->pkt_type == PACKET_OTHERHOST) ++ goto out; ++ ++ if (skb_shared(skb)) ++ goto out; ++ ++ /* IP header correctness testing: */ ++ iph = (struct iphdr *)skb->data; ++ if (!pskb_may_pull(skb, sizeof(struct iphdr))) ++ goto out; ++ ++ if (iph->ihl < 5 || iph->version != 4) ++ goto out; ++ ++ if (!pskb_may_pull(skb, iph->ihl*4)) ++ goto out; ++ ++ if (ip_fast_csum((u8 *)iph, iph->ihl) != 0) ++ goto out; ++ ++ len = ntohs(iph->tot_len); ++ if (skb->len < len || len < iph->ihl*4) ++ goto out; ++ ++ saddr = iph->saddr; ++ daddr = iph->daddr; ++ if (iph->protocol != IPPROTO_UDP) ++ goto out; ++ ++ if (source_ip != daddr) ++ goto out; ++ ++ if (target_ip != saddr) ++ goto out; ++ ++ len -= iph->ihl*4; ++ uh = (struct udphdr *)(((char *)iph) + iph->ihl*4); ++ ulen = ntohs(uh->len); ++ ++ if (ulen != len || ulen < (sizeof(*uh) + sizeof(*__req))) ++ goto out; ++ ++ if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0) ++ goto out; ++ ++ if (udp_checksum_complete(skb)) ++ goto out; ++ ++ if (source_port != uh->dest) ++ goto out; ++ ++ if (target_port != uh->source) ++ goto out; ++ ++ __req = (req_t *)(uh + 1); ++ if ((ntohl(__req->command) != COMM_GET_MAGIC) && ++ (ntohl(__req->command) != COMM_HELLO) && ++ (ntohl(__req->command) != COMM_START_WRITE_NETDUMP_ACK) && ++ (ntohl(__req->command) != COMM_START_NETDUMP_ACK) && ++ (memcmp(&__req->magic, &dump_magic, sizeof(dump_magic)) != 0)) ++ goto out; ++ ++ req.magic = ntohl(__req->magic); ++ req.command = ntohl(__req->command); ++ req.from = ntohl(__req->from); ++ req.to = ntohl(__req->to); ++ req.nr = ntohl(__req->nr); ++ new_req = 1; ++out: ++ return NET_RX_DROP; ++} ++ ++static void ++dump_send_mem(struct net_device *dev, req_t *req, const char* buff, size_t len) ++{ ++ int i; ++ ++ int nr_chunks = len/1024; ++ reply_t reply; ++ ++ reply.nr = req->nr; ++ reply.info = 0; ++ ++ if ( nr_chunks <= 0) ++ nr_chunks = 1; ++ for (i = 0; i < nr_chunks; i++) { ++ unsigned int offset = i*1024; ++ reply.code = REPLY_MEM; ++ reply.info = offset; ++ dump_send_skb(dev, buff + offset, 1024, &reply); ++ } ++} ++ ++/* ++ * This function waits for the client to acknowledge the receipt ++ * of the netdump startup reply, with the possibility of packets ++ * getting lost. We resend the startup packet if no ACK is received, ++ * after a 1 second delay. ++ * ++ * (The client can test the success of the handshake via the HELLO ++ * command, and send ACKs until we enter netdump mode.) ++ */ ++static int ++dump_handshake(struct dump_dev *net_dev) ++{ ++ char tmp[200]; ++ reply_t reply; ++ int i, j; ++ ++ if (startup_handshake) { ++ sprintf(tmp, "NETDUMP start, waiting for start-ACK.\n"); ++ reply.code = REPLY_START_NETDUMP; ++ reply.nr = 0; ++ reply.info = 0; ++ } else { ++ sprintf(tmp, "NETDUMP start, waiting for start-ACK.\n"); ++ reply.code = REPLY_START_WRITE_NETDUMP; ++ reply.nr = net_dev->curr_offset; ++ reply.info = net_dev->curr_offset; ++ } ++ ++ /* send 300 handshake packets before declaring failure */ ++ for (i = 0; i < 300; i++) { ++ dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply); ++ ++ /* wait 1 sec */ ++ for (j = 0; j < 10000; j++) { ++ udelay(100); ++ dump_ndev->poll_controller(dump_ndev); ++ zap_completion_queue(); ++ if (new_req) ++ break; ++ } ++ ++ /* ++ * if there is no new request, try sending the handshaking ++ * packet again ++ */ ++ if (!new_req) ++ continue; ++ ++ /* ++ * check if the new request is of the expected type, ++ * if so, return, else try sending the handshaking ++ * packet again ++ */ ++ if (startup_handshake) { ++ if (req.command == COMM_HELLO || req.command == ++ COMM_START_NETDUMP_ACK) { ++ return 0; ++ } else { ++ new_req = 0; ++ continue; ++ } ++ } else { ++ if (req.command == COMM_SEND_MEM) { ++ return 0; ++ } else { ++ new_req = 0; ++ continue; ++ } ++ } ++ } ++ return -1; ++} ++ ++static ssize_t ++do_netdump(struct dump_dev *net_dev, const char* buff, size_t len) ++{ ++ reply_t reply; ++ char tmp[200]; ++ ssize_t ret = 0; ++ int repeatCounter, counter, total_loop; ++ ++ netdump_in_progress = 1; ++ ++ if (dump_handshake(net_dev) < 0) { ++ printk("network dump failed due to handshake failure\n"); ++ goto out; ++ } ++ ++ /* ++ * Ideally startup handshake should be done during dump configuration, ++ * i.e., in dump_net_open(). This will be done when I figure out ++ * the dependency between startup handshake, subsequent write and ++ * various commands wrt to net-server. ++ */ ++ if (startup_handshake) ++ startup_handshake = 0; ++ ++ counter = 0; ++ repeatCounter = 0; ++ total_loop = 0; ++ while (1) { ++ if (!new_req) { ++ dump_ndev->poll_controller(dump_ndev); ++ zap_completion_queue(); ++ } ++ if (!new_req) { ++ repeatCounter++; ++ ++ if (repeatCounter > 5) { ++ counter++; ++ if (counter > 10000) { ++ if (total_loop >= 100000) { ++ printk("Time OUT LEAVE NOW\n"); ++ goto out; ++ } else { ++ total_loop++; ++ printk("Try number %d out of " ++ "10 before Time Out\n", ++ total_loop); ++ } ++ } ++ mdelay(1); ++ repeatCounter = 0; ++ } ++ continue; ++ } ++ repeatCounter = 0; ++ counter = 0; ++ total_loop = 0; ++ new_req = 0; ++ switch (req.command) { ++ case COMM_NONE: ++ break; ++ ++ case COMM_SEND_MEM: ++ dump_send_mem(dump_ndev, &req, buff, len); ++ break; ++ ++ case COMM_EXIT: ++ case COMM_START_WRITE_NETDUMP_ACK: ++ ret = len; ++ goto out; ++ ++ case COMM_HELLO: ++ sprintf(tmp, "Hello, this is netdump version " ++ "0.%02d\n", NETCONSOLE_VERSION); ++ reply.code = REPLY_HELLO; ++ reply.nr = req.nr; ++ reply.info = net_dev->curr_offset; ++ dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply); ++ break; ++ ++ case COMM_GET_PAGE_SIZE: ++ sprintf(tmp, "PAGE_SIZE: %ld\n", PAGE_SIZE); ++ reply.code = REPLY_PAGE_SIZE; ++ reply.nr = req.nr; ++ reply.info = PAGE_SIZE; ++ dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply); ++ break; ++ ++ case COMM_GET_NR_PAGES: ++ reply.code = REPLY_NR_PAGES; ++ reply.nr = req.nr; ++ reply.info = num_physpages; ++ reply.info = page_counter; ++ sprintf(tmp, "Number of pages: %ld\n", num_physpages); ++ dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply); ++ break; ++ ++ case COMM_GET_MAGIC: ++ reply.code = REPLY_MAGIC; ++ reply.nr = req.nr; ++ reply.info = NETCONSOLE_VERSION; ++ dump_send_skb(dump_ndev, (char *)&dump_magic, ++ sizeof(dump_magic), &reply); ++ break; ++ ++ default: ++ reply.code = REPLY_ERROR; ++ reply.nr = req.nr; ++ reply.info = req.command; ++ sprintf(tmp, "Got unknown command code %d!\n", ++ req.command); ++ dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply); ++ break; ++ } ++ } ++out: ++ netdump_in_progress = 0; ++ return ret; ++} ++ ++static int ++dump_validate_config(void) ++{ ++ source_ip = dump_in_dev->ifa_list->ifa_local; ++ if (!source_ip) { ++ printk("network device %s has no local address, " ++ "aborting.\n", device_name); ++ return -1; ++ } ++ ++#define IP(x) ((unsigned char *)&source_ip)[x] ++ printk("Source %d.%d.%d.%d", IP(0), IP(1), IP(2), IP(3)); ++#undef IP ++ ++ if (!source_port) { ++ printk("source_port parameter not specified, aborting.\n"); ++ return -1; ++ } ++ printk(":%i\n", source_port); ++ source_port = htons(source_port); ++ ++ if (!target_ip) { ++ printk("target_ip parameter not specified, aborting.\n"); ++ return -1; ++ } ++ ++#define IP(x) ((unsigned char *)&target_ip)[x] ++ printk("Target %d.%d.%d.%d", IP(0), IP(1), IP(2), IP(3)); ++#undef IP ++ ++ if (!target_port) { ++ printk("target_port parameter not specified, aborting.\n"); ++ return -1; ++ } ++ printk(":%i\n", target_port); ++ target_port = htons(target_port); ++ ++ printk("Target Ethernet Address %02x:%02x:%02x:%02x:%02x:%02x", ++ daddr[0], daddr[1], daddr[2], daddr[3], daddr[4], daddr[5]); ++ ++ if ((daddr[0] & daddr[1] & daddr[2] & daddr[3] & daddr[4] & ++ daddr[5]) == 255) ++ printk("(Broadcast)"); ++ printk("\n"); ++ return 0; ++} ++ ++/* ++ * Prepares the dump device so we can take a dump later. ++ * Validates the netdump configuration parameters. ++ * ++ * TODO: Network connectivity check should be done here. ++ */ ++static int ++dump_net_open(struct dump_dev *net_dev, unsigned long arg) ++{ ++ int retval = 0; ++ ++ /* get the interface name */ ++ if (copy_from_user(device_name, (void *)arg, IFNAMSIZ)) ++ return -EFAULT; ++ ++ if (!(dump_ndev = dev_get_by_name(device_name))) { ++ printk("network device %s does not exist, aborting.\n", ++ device_name); ++ return -ENODEV; ++ } ++ ++ if (!dump_ndev->poll_controller) { ++ printk("network device %s does not implement polling yet, " ++ "aborting.\n", device_name); ++ retval = -1; /* return proper error */ ++ goto err1; ++ } ++ ++ if (!(dump_in_dev = in_dev_get(dump_ndev))) { ++ printk("network device %s is not an IP protocol device, " ++ "aborting.\n", device_name); ++ retval = -EINVAL; ++ goto err1; ++ } ++ ++ if ((retval = dump_validate_config()) < 0) ++ goto err2; ++ ++ net_dev->curr_offset = 0; ++ printk("Network device %s successfully configured for dumping\n", ++ device_name); ++ return retval; ++err2: ++ in_dev_put(dump_in_dev); ++err1: ++ dev_put(dump_ndev); ++ return retval; ++} ++ ++/* ++ * Close the dump device and release associated resources ++ * Invoked when unconfiguring the dump device. ++ */ ++static int ++dump_net_release(struct dump_dev *net_dev) ++{ ++ if (dump_in_dev) ++ in_dev_put(dump_in_dev); ++ if (dump_ndev) ++ dev_put(dump_ndev); ++ return 0; ++} ++ ++/* ++ * Prepare the dump device for use (silence any ongoing activity ++ * and quiesce state) when the system crashes. ++ */ ++static int ++dump_net_silence(struct dump_dev *net_dev) ++{ ++ local_irq_save(flags_global); ++ dump_ndev->rx_hook = dump_rx_hook; ++ startup_handshake = 1; ++ net_dev->curr_offset = 0; ++ printk("Dumping to network device %s on CPU %d ...\n", device_name, ++ smp_processor_id()); ++ return 0; ++} ++ ++/* ++ * Invoked when dumping is done. This is the time to put things back ++ * (i.e. undo the effects of dump_block_silence) so the device is ++ * available for normal use. ++ */ ++static int ++dump_net_resume(struct dump_dev *net_dev) ++{ ++ int indx; ++ reply_t reply; ++ char tmp[200]; ++ ++ if (!dump_ndev) ++ return (0); ++ ++ sprintf(tmp, "NETDUMP end.\n"); ++ for( indx = 0; indx < 6; indx++) { ++ reply.code = REPLY_END_NETDUMP; ++ reply.nr = 0; ++ reply.info = 0; ++ dump_send_skb(dump_ndev, tmp, strlen(tmp), &reply); ++ } ++ printk("NETDUMP END!\n"); ++ local_irq_restore(flags_global); ++ dump_ndev->rx_hook = NULL; ++ startup_handshake = 0; ++ return 0; ++} ++ ++/* ++ * Seek to the specified offset in the dump device. ++ * Makes sure this is a valid offset, otherwise returns an error. ++ */ ++static int ++dump_net_seek(struct dump_dev *net_dev, loff_t off) ++{ ++ /* ++ * For now using DUMP_HEADER_OFFSET as hard coded value, ++ * See dump_block_seekin dump_blockdev.c to know how to ++ * do this properly. ++ */ ++ net_dev->curr_offset = off + DUMP_HEADER_OFFSET; ++ return 0; ++} ++ ++/* ++ * ++ */ ++static int ++dump_net_write(struct dump_dev *net_dev, void *buf, unsigned long len) ++{ ++ int cnt, i, off; ++ ssize_t ret; ++ ++ cnt = len/ PAGE_SIZE; ++ ++ for (i = 0; i < cnt; i++) { ++ off = i* PAGE_SIZE; ++ ret = do_netdump(net_dev, buf+off, PAGE_SIZE); ++ if (ret <= 0) ++ return -1; ++ net_dev->curr_offset = net_dev->curr_offset + PAGE_SIZE; ++ } ++ return len; ++} ++ ++/* ++ * check if the last dump i/o is over and ready for next request ++ */ ++static int ++dump_net_ready(struct dump_dev *net_dev, void *buf) ++{ ++ return 0; ++} ++ ++/* ++ * ioctl function used for configuring network dump ++ */ ++static int ++dump_net_ioctl(struct dump_dev *net_dev, unsigned int cmd, unsigned long arg) ++{ ++ switch (cmd) { ++ case DIOSTARGETIP: ++ target_ip = arg; ++ break; ++ case DIOSTARGETPORT: ++ target_port = (u16)arg; ++ break; ++ case DIOSSOURCEPORT: ++ source_port = (u16)arg; ++ break; ++ case DIOSETHADDR: ++ return copy_from_user(daddr, (void *)arg, 6); ++ break; ++ case DIOGTARGETIP: ++ case DIOGTARGETPORT: ++ case DIOGSOURCEPORT: ++ case DIOGETHADDR: ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++struct dump_dev_ops dump_netdev_ops = { ++ .open = dump_net_open, ++ .release = dump_net_release, ++ .silence = dump_net_silence, ++ .resume = dump_net_resume, ++ .seek = dump_net_seek, ++ .write = dump_net_write, ++ /* .read not implemented */ ++ .ready = dump_net_ready, ++ .ioctl = dump_net_ioctl ++}; ++ ++static struct dump_dev default_dump_netdev = { ++ .type_name = "networkdev", ++ .ops = &dump_netdev_ops, ++ .curr_offset = 0 ++}; ++ ++static int __init ++dump_netdev_init(void) ++{ ++ default_dump_netdev.curr_offset = 0; ++ ++ if (dump_register_device(&default_dump_netdev) < 0) { ++ printk("network dump device driver registration failed\n"); ++ return -1; ++ } ++ printk("network device driver for LKCD registered\n"); ++ ++ get_random_bytes(&dump_magic, sizeof(dump_magic)); ++ return 0; ++} ++ ++static void __exit ++dump_netdev_cleanup(void) ++{ ++ dump_unregister_device(&default_dump_netdev); ++} ++ ++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>"); ++MODULE_DESCRIPTION("Network Dump Driver for Linux Kernel Crash Dump (LKCD)"); ++MODULE_LICENSE("GPL"); ++ ++module_init(dump_netdev_init); ++module_exit(dump_netdev_cleanup); +--- linux-2.5.69/drivers/dump/dump_overlay.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_overlay.c Fri Feb 7 06:47:58 2003 +@@ -0,0 +1,848 @@ ++/* ++ * Two-stage soft-boot based dump scheme methods (memory overlay ++ * with post soft-boot writeout) ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * ++ * This approach of saving the dump in memory and writing it ++ * out after a softboot without clearing memory is derived from the ++ * Mission Critical Linux dump implementation. Credits and a big ++ * thanks for letting the lkcd project make use of the excellent ++ * piece of work and also for helping with clarifications and ++ * tips along the way are due to: ++ * Dave Winchell <winchell@mclx.com> (primary author of mcore) ++ * and also to ++ * Jeff Moyer <moyer@mclx.com> ++ * Josh Huber <huber@mclx.com> ++ * ++ * For those familiar with the mcore implementation, the key ++ * differences/extensions here are in allowing entire memory to be ++ * saved (in compressed form) through a careful ordering scheme ++ * on both the way down as well on the way up after boot, the latter ++ * for supporting the LKCD notion of passes in which most critical ++ * data is the first to be saved to the dump device. Also the post ++ * boot writeout happens from within the kernel rather than driven ++ * from userspace. ++ * ++ * The sequence is orchestrated through the abstraction of "dumpers", ++ * one for the first stage which then sets up the dumper for the next ++ * stage, providing for a smooth and flexible reuse of the singlestage ++ * dump scheme methods and a handle to pass dump device configuration ++ * information across the soft boot. ++ * ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* ++ * Disruptive dumping using the second kernel soft-boot option ++ * for issuing dump i/o operates in 2 stages: ++ * ++ * (1) - Saves the (compressed & formatted) dump in memory using a ++ * carefully ordered overlay scheme designed to capture the ++ * entire physical memory or selective portions depending on ++ * dump config settings, ++ * - Registers the stage 2 dumper and ++ * - Issues a soft reboot w/o clearing memory. ++ * ++ * The overlay scheme starts with a small bootstrap free area ++ * and follows a reverse ordering of passes wherein it ++ * compresses and saves data starting with the least critical ++ * areas first, thus freeing up the corresponding pages to ++ * serve as destination for subsequent data to be saved, and ++ * so on. With a good compression ratio, this makes it feasible ++ * to capture an entire physical memory dump without significantly ++ * reducing memory available during regular operation. ++ * ++ * (2) Post soft-reboot, runs through the saved memory dump and ++ * writes it out to disk, this time around, taking care to ++ * save the more critical data first (i.e. pages which figure ++ * in early passes for a regular dump). Finally issues a ++ * clean reboot. ++ * ++ * Since the data was saved in memory after selection/filtering ++ * and formatted as per the chosen output dump format, at this ++ * stage the filter and format actions are just dummy (or ++ * passthrough) actions, except for influence on ordering of ++ * passes. ++ */ ++ ++#include <linux/types.h> ++#include <linux/kernel.h> ++#include <linux/highmem.h> ++#include <linux/bootmem.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++extern struct list_head dumper_list_head; ++extern struct dump_memdev *dump_memdev; ++extern struct dumper dumper_stage2; ++struct dump_config_block *dump_saved_config = NULL; ++extern struct dump_blockdev *dump_blockdev; ++static struct dump_memdev *saved_dump_memdev = NULL; ++static struct dumper *saved_dumper = NULL; ++ ++/* For testing ++extern void dump_display_map(struct dump_memdev *); ++*/ ++ ++struct dumper *dumper_by_name(char *name) ++{ ++#ifdef LATER ++ struct dumper *dumper; ++ list_for_each_entry(dumper, &dumper_list_head, dumper_list) ++ if (!strncmp(dumper->name, name, 32)) ++ return dumper; ++ ++ /* not found */ ++ return NULL; ++#endif ++ /* Temporary proof of concept */ ++ if (!strncmp(dumper_stage2.name, name, 32)) ++ return &dumper_stage2; ++ else ++ return NULL; ++} ++ ++#ifdef CONFIG_CRASH_DUMP_SOFTBOOT ++extern void dump_early_reserve_map(struct dump_memdev *); ++ ++void crashdump_reserve(void) ++{ ++ extern unsigned long crashdump_addr; ++ ++ if (crashdump_addr == 0xdeadbeef) ++ return; ++ ++ /* reserve dump config and saved dump pages */ ++ dump_saved_config = (struct dump_config_block *)crashdump_addr; ++ /* magic verification */ ++ if (dump_saved_config->magic != DUMP_MAGIC_LIVE) { ++ printk("Invalid dump magic. Ignoring dump\n"); ++ dump_saved_config = NULL; ++ return; ++ } ++ ++ printk("Dump may be available from previous boot\n"); ++ ++ reserve_bootmem(virt_to_phys((void *)crashdump_addr), ++ PAGE_ALIGN(sizeof(struct dump_config_block))); ++ dump_early_reserve_map(&dump_saved_config->memdev); ++ ++} ++#endif ++ ++/* ++ * Loads the dump configuration from a memory block saved across soft-boot ++ * The ops vectors need fixing up as the corresp. routines may have ++ * relocated in the new soft-booted kernel. ++ */ ++int dump_load_config(struct dump_config_block *config) ++{ ++ struct dumper *dumper; ++ struct dump_data_filter *filter_table, *filter; ++ struct dump_dev *dev; ++ int i; ++ ++ if (config->magic != DUMP_MAGIC_LIVE) ++ return -ENOENT; /* not a valid config */ ++ ++ /* initialize generic config data */ ++ memcpy(&dump_config, &config->config, sizeof(dump_config)); ++ ++ /* initialize dumper state */ ++ if (!(dumper = dumper_by_name(config->dumper.name))) { ++ printk("dumper name mismatch\n"); ++ return -ENOENT; /* dumper mismatch */ ++ } ++ ++ /* verify and fixup schema */ ++ if (strncmp(dumper->scheme->name, config->scheme.name, 32)) { ++ printk("dumper scheme mismatch\n"); ++ return -ENOENT; /* mismatch */ ++ } ++ config->scheme.ops = dumper->scheme->ops; ++ config->dumper.scheme = &config->scheme; ++ ++ /* verify and fixup filter operations */ ++ filter_table = dumper->filter; ++ for (i = 0, filter = config->filter_table; ++ ((i < MAX_PASSES) && filter_table[i].selector); ++ i++, filter++) { ++ if (strncmp(filter_table[i].name, filter->name, 32)) { ++ printk("dump filter mismatch\n"); ++ return -ENOENT; /* filter name mismatch */ ++ } ++ filter->selector = filter_table[i].selector; ++ } ++ config->dumper.filter = config->filter_table; ++ ++ /* fixup format */ ++ if (strncmp(dumper->fmt->name, config->fmt.name, 32)) { ++ printk("dump format mismatch\n"); ++ return -ENOENT; /* mismatch */ ++ } ++ config->fmt.ops = dumper->fmt->ops; ++ config->dumper.fmt = &config->fmt; ++ ++ /* fixup target device */ ++ dev = (struct dump_dev *)(&config->dev[0]); ++ if (dumper->dev == NULL) { ++ pr_debug("Vanilla dumper - assume default\n"); ++ if (dump_dev == NULL) ++ return -ENODEV; ++ dumper->dev = dump_dev; ++ } ++ ++ if (strncmp(dumper->dev->type_name, dev->type_name, 32)) { ++ printk("dump dev type mismatch %s instead of %s\n", ++ dev->type_name, dumper->dev->type_name); ++ return -ENOENT; /* mismatch */ ++ } ++ dev->ops = dumper->dev->ops; ++ config->dumper.dev = dev; ++ ++ /* fixup memory device containing saved dump pages */ ++ /* assume statically init'ed dump_memdev */ ++ config->memdev.ddev.ops = dump_memdev->ddev.ops; ++ /* switch to memdev from prev boot */ ++ saved_dump_memdev = dump_memdev; /* remember current */ ++ dump_memdev = &config->memdev; ++ ++ /* Make this the current primary dumper */ ++ dump_config.dumper = &config->dumper; ++ ++ return 0; ++} ++ ++/* Saves the dump configuration in a memory block for use across a soft-boot */ ++int dump_save_config(struct dump_config_block *config) ++{ ++ printk("saving dump config settings\n"); ++ ++ /* dump config settings */ ++ memcpy(&config->config, &dump_config, sizeof(dump_config)); ++ ++ /* dumper state */ ++ memcpy(&config->dumper, dump_config.dumper, sizeof(struct dumper)); ++ memcpy(&config->scheme, dump_config.dumper->scheme, ++ sizeof(struct dump_scheme)); ++ memcpy(&config->fmt, dump_config.dumper->fmt, sizeof(struct dump_fmt)); ++ memcpy(&config->dev[0], dump_config.dumper->dev, ++ sizeof(struct dump_anydev)); ++ memcpy(&config->filter_table, dump_config.dumper->filter, ++ sizeof(struct dump_data_filter)*MAX_PASSES); ++ ++ /* handle to saved mem pages */ ++ memcpy(&config->memdev, dump_memdev, sizeof(struct dump_memdev)); ++ ++ config->magic = DUMP_MAGIC_LIVE; ++ ++ return 0; ++} ++ ++int dump_init_stage2(struct dump_config_block *saved_config) ++{ ++ int err = 0; ++ ++ pr_debug("dump_init_stage2\n"); ++ /* Check if dump from previous boot exists */ ++ if (saved_config) { ++ printk("loading dumper from previous boot \n"); ++ /* load and configure dumper from previous boot */ ++ if ((err = dump_load_config(saved_config))) ++ return err; ++ ++ if (!dump_oncpu) { ++ if ((err = dump_configure(dump_config.dump_device))) { ++ printk("Stage 2 dump configure failed\n"); ++ return err; ++ } ++ } ++ ++ dumper_reset(); ++ dump_dev = dump_config.dumper->dev; ++ /* write out the dump */ ++ err = dump_generic_execute(NULL, NULL); ++ ++ dump_saved_config = NULL; ++ ++ if (!dump_oncpu) { ++ dump_unconfigure(); ++ } ++ ++ return err; ++ ++ } else { ++ /* no dump to write out */ ++ printk("no dumper from previous boot \n"); ++ return 0; ++ } ++} ++ ++extern void dump_mem_markpages(struct dump_memdev *); ++ ++int dump_switchover_stage(void) ++{ ++ int ret = 0; ++ ++ /* trigger stage 2 rightaway - in real life would be after soft-boot */ ++ /* dump_saved_config would be a boot param */ ++ saved_dump_memdev = dump_memdev; ++ saved_dumper = dump_config.dumper; ++ ret = dump_init_stage2(dump_saved_config); ++ dump_memdev = saved_dump_memdev; ++ dump_config.dumper = saved_dumper; ++ return ret; ++} ++ ++int dump_activate_softboot(void) ++{ ++ int err = 0; ++ ++ /* temporary - switchover to writeout previously saved dump */ ++ err = dump_switchover_stage(); /* non-disruptive case */ ++ if (dump_oncpu) ++ dump_config.dumper = &dumper_stage1; /* set things back */ ++ ++ return err; ++ ++ dump_silence_level = DUMP_HALT_CPUS; ++ /* wait till we become the only cpu */ ++ /* maybe by checking for online cpus ? */ ++ ++ /* now call into kexec */ ++ ++ /* TBD/Fixme: ++ * should we call reboot notifiers ? inappropriate for panic ? ++ * what about device_shutdown() ? ++ * is explicit bus master disabling needed or can we do that ++ * through driverfs ? ++ */ ++ return 0; ++} ++ ++/* --- DUMP SCHEME ROUTINES --- */ ++ ++static inline int dump_buf_pending(struct dumper *dumper) ++{ ++ return (dumper->curr_buf - dumper->dump_buf); ++} ++ ++/* Invoked during stage 1 of soft-reboot based dumping */ ++int dump_overlay_sequencer(void) ++{ ++ struct dump_data_filter *filter = dump_config.dumper->filter; ++ struct dump_data_filter *filter2 = dumper_stage2.filter; ++ int pass = 0, err = 0, save = 0; ++ int (*action)(unsigned long, unsigned long); ++ ++ /* Make sure gzip compression is being used */ ++ if (dump_config.dumper->compress->compress_type != DUMP_COMPRESS_GZIP) { ++ printk(" Please set GZIP compression \n"); ++ return -EINVAL; ++ } ++ ++ /* start filling in dump data right after the header */ ++ dump_config.dumper->curr_offset = ++ PAGE_ALIGN(dump_config.dumper->header_len); ++ ++ /* Locate the last pass */ ++ for (;filter->selector; filter++, pass++); ++ ++ /* ++ * Start from the end backwards: overlay involves a reverse ++ * ordering of passes, since less critical pages are more ++ * likely to be reusable as scratch space once we are through ++ * with them. ++ */ ++ for (--pass, --filter; pass >= 0; pass--, filter--) ++ { ++ /* Assumes passes are exclusive (even across dumpers) */ ++ /* Requires care when coding the selection functions */ ++ if ((save = filter->level_mask & dump_config.level)) ++ action = dump_save_data; ++ else ++ action = dump_skip_data; ++ ++ /* Remember the offset where this pass started */ ++ /* The second stage dumper would use this */ ++ if (dump_buf_pending(dump_config.dumper) & (PAGE_SIZE - 1)) { ++ pr_debug("Starting pass %d with pending data\n", pass); ++ pr_debug("filling dummy data to page-align it\n"); ++ dump_config.dumper->curr_buf = (void *)PAGE_ALIGN( ++ (unsigned long)dump_config.dumper->curr_buf); ++ } ++ ++ filter2[pass].start = dump_config.dumper->curr_offset ++ + dump_buf_pending(dump_config.dumper); ++ ++ err = dump_iterator(pass, action, filter); ++ ++ filter2[pass].end = dump_config.dumper->curr_offset ++ + dump_buf_pending(dump_config.dumper); ++ ++ if (err < 0) { ++ printk("dump_overlay_seq: failure %d in pass %d\n", ++ err, pass); ++ break; ++ } ++ printk("\n %d overlay pages %s of %d each in pass %d\n", ++ err, save ? "saved" : "skipped", DUMP_PAGE_SIZE, pass); ++ } ++ ++ return err; ++} ++ ++/* from dump_memdev.c */ ++extern struct page *dump_mem_lookup(struct dump_memdev *dev, unsigned long loc); ++extern struct page *dump_mem_next_page(struct dump_memdev *dev); ++ ++static inline struct page *dump_get_saved_page(loff_t loc) ++{ ++ return (dump_mem_lookup(dump_memdev, loc >> PAGE_SHIFT)); ++} ++ ++static inline struct page *dump_next_saved_page(void) ++{ ++ return (dump_mem_next_page(dump_memdev)); ++} ++ ++/* ++ * Iterates over list of saved dump pages. Invoked during second stage of ++ * soft boot dumping ++ * ++ * Observation: If additional selection is desired at this stage then ++ * a different iterator could be written which would advance ++ * to the next page header everytime instead of blindly picking up ++ * the data. In such a case loc would be interpreted differently. ++ * At this moment however a blind pass seems sufficient, cleaner and ++ * faster. ++ */ ++int dump_saved_data_iterator(int pass, int (*action)(unsigned long, ++ unsigned long), struct dump_data_filter *filter) ++{ ++ loff_t loc = filter->start; ++ struct page *page; ++ unsigned long count = 0; ++ int err = 0; ++ unsigned long sz; ++ ++ printk("pass %d, start off 0x%llx end offset 0x%llx\n", pass, ++ filter->start, filter->end); ++ ++ /* loc will get treated as logical offset into stage 1 */ ++ page = dump_get_saved_page(loc); ++ ++ for (; loc < filter->end; loc += PAGE_SIZE) { ++ dump_config.dumper->curr_loc = loc; ++ if (!page) { ++ printk("no more saved data for pass %d\n", pass); ++ break; ++ } ++ sz = (loc + PAGE_SIZE > filter->end) ? filter->end - loc : ++ PAGE_SIZE; ++ ++ if (page && filter->selector(pass, (unsigned long)page, ++ PAGE_SIZE)) { ++ pr_debug("mem offset 0x%llx\n", loc); ++ if ((err = action((unsigned long)page, sz))) ++ break; ++ else ++ count++; ++ /* clear the contents of page */ ++ /* fixme: consider using KM_DUMP instead */ ++ clear_highpage(page); ++ ++ } ++ page = dump_next_saved_page(); ++ } ++ ++ return err ? err : count; ++} ++ ++static inline int dump_overlay_pages_done(struct page *page, int nr) ++{ ++ int ret=0; ++ ++ for (; nr ; page++, nr--) { ++ if (dump_check_and_free_page(dump_memdev, page)) ++ ret++; ++ } ++ return ret; ++} ++ ++int dump_overlay_save_data(unsigned long loc, unsigned long len) ++{ ++ int err = 0; ++ struct page *page = (struct page *)loc; ++ static unsigned long cnt = 0; ++ ++ if ((err = dump_generic_save_data(loc, len))) ++ return err; ++ ++ if (dump_overlay_pages_done(page, len >> PAGE_SHIFT)) { ++ cnt++; ++ if (!(cnt & 0x7f)) ++ pr_debug("released page 0x%lx\n", page_to_pfn(page)); ++ } ++ ++ return err; ++} ++ ++ ++int dump_overlay_skip_data(unsigned long loc, unsigned long len) ++{ ++ struct page *page = (struct page *)loc; ++ ++ dump_overlay_pages_done(page, len >> PAGE_SHIFT); ++ return 0; ++} ++ ++int dump_overlay_resume(void) ++{ ++ int err = 0; ++ ++ /* ++ * switch to stage 2 dumper, save dump_config_block ++ * and then trigger a soft-boot ++ */ ++ dumper_stage2.header_len = dump_config.dumper->header_len; ++ dump_config.dumper = &dumper_stage2; ++ if ((err = dump_save_config(dump_saved_config))) ++ return err; ++ ++ dump_dev = dump_config.dumper->dev; ++ ++ return err; ++ err = dump_switchover_stage(); /* plugs into soft boot mechanism */ ++ dump_config.dumper = &dumper_stage1; /* set things back */ ++ return err; ++} ++ ++int dump_overlay_configure(unsigned long devid) ++{ ++ struct dump_dev *dev; ++ struct dump_config_block *saved_config = dump_saved_config; ++ int err = 0; ++ ++ /* If there is a previously saved dump, write it out first */ ++ if (saved_config) { ++ printk("Processing old dump pending writeout\n"); ++ err = dump_switchover_stage(); ++ if (err) { ++ printk("failed to writeout saved dump\n"); ++ return err; ++ } ++ dump_free_mem(saved_config); /* testing only: not after boot */ ++ } ++ ++ dev = dumper_stage2.dev = dump_config.dumper->dev; ++ /* From here on the intermediate dump target is memory-only */ ++ dump_dev = dump_config.dumper->dev = &dump_memdev->ddev; ++ if ((err = dump_generic_configure(0))) { ++ printk("dump generic configure failed: err %d\n", err); ++ return err; ++ } ++ /* temporary */ ++ dumper_stage2.dump_buf = dump_config.dumper->dump_buf; ++ ++ /* Sanity check on the actual target dump device */ ++ if (!dev || (err = dev->ops->open(dev, devid))) { ++ return err; ++ } ++ /* TBD: should we release the target if this is soft-boot only ? */ ++ ++ /* alloc a dump config block area to save across reboot */ ++ if (!(dump_saved_config = dump_alloc_mem(sizeof(struct ++ dump_config_block)))) { ++ printk("dump config block alloc failed\n"); ++ /* undo configure */ ++ dump_generic_unconfigure(); ++ return -ENOMEM; ++ } ++ dump_config.dump_addr = (unsigned long)dump_saved_config; ++ printk("Dump config block of size %d set up at 0x%lx\n", ++ sizeof(*dump_saved_config), (unsigned long)dump_saved_config); ++ return 0; ++} ++ ++int dump_overlay_unconfigure(void) ++{ ++ struct dump_dev *dev = dumper_stage2.dev; ++ int err = 0; ++ ++ pr_debug("dump_overlay_unconfigure\n"); ++ /* Close the secondary device */ ++ dev->ops->release(dev); ++ pr_debug("released secondary device\n"); ++ ++ err = dump_generic_unconfigure(); ++ pr_debug("Unconfigured generic portions\n"); ++ dump_free_mem(dump_saved_config); ++ dump_saved_config = NULL; ++ pr_debug("Freed saved config block\n"); ++ dump_dev = dump_config.dumper->dev = dumper_stage2.dev; ++ ++ printk("Unconfigured overlay dumper\n"); ++ return err; ++} ++ ++int dump_staged_unconfigure(void) ++{ ++ int err = 0; ++ struct dump_config_block *saved_config = dump_saved_config; ++ struct dump_dev *dev; ++ ++ pr_debug("dump_staged_unconfigure\n"); ++ err = dump_generic_unconfigure(); ++ ++ /* now check if there is a saved dump waiting to be written out */ ++ if (saved_config) { ++ printk("Processing saved dump pending writeout\n"); ++ if ((err = dump_switchover_stage())) { ++ printk("Error in commiting saved dump at 0x%lx\n", ++ (unsigned long)saved_config); ++ printk("Old dump may hog memory\n"); ++ } else { ++ dump_free_mem(saved_config); ++ pr_debug("Freed saved config block\n"); ++ } ++ dump_saved_config = NULL; ++ } else { ++ dev = &dump_memdev->ddev; ++ dev->ops->release(dev); ++ } ++ printk("Unconfigured second stage dumper\n"); ++ ++ return 0; ++} ++ ++/* ----- PASSTHRU FILTER ROUTINE --------- */ ++ ++/* transparent - passes everything through */ ++int dump_passthru_filter(int pass, unsigned long loc, unsigned long sz) ++{ ++ return 1; ++} ++ ++/* ----- PASSTRU FORMAT ROUTINES ---- */ ++ ++ ++int dump_passthru_configure_header(const char *panic_str, const struct pt_regs *regs) ++{ ++ dump_config.dumper->header_dirty++; ++ return 0; ++} ++ ++/* Copies bytes of data from page(s) to the specified buffer */ ++int dump_copy_pages(void *buf, struct page *page, unsigned long sz) ++{ ++ unsigned long len = 0, bytes; ++ void *addr; ++ ++ while (len < sz) { ++ addr = kmap_atomic(page, KM_DUMP); ++ bytes = (sz > len + PAGE_SIZE) ? PAGE_SIZE : sz - len; ++ memcpy(buf, addr, bytes); ++ kunmap_atomic(addr, KM_DUMP); ++ buf += bytes; ++ len += bytes; ++ page++; ++ } ++ /* memset(dump_config.dumper->curr_buf, 0x57, len); temporary */ ++ ++ return sz - len; ++} ++ ++int dump_passthru_update_header(void) ++{ ++ long len = dump_config.dumper->header_len; ++ struct page *page; ++ void *buf = dump_config.dumper->dump_buf; ++ int err = 0; ++ ++ if (!dump_config.dumper->header_dirty) ++ return 0; ++ ++ pr_debug("Copying header of size %ld bytes from memory\n", len); ++ if (len > DUMP_BUFFER_SIZE) ++ return -E2BIG; ++ ++ page = dump_mem_lookup(dump_memdev, 0); ++ for (; (len > 0) && page; buf += PAGE_SIZE, len -= PAGE_SIZE) { ++ if ((err = dump_copy_pages(buf, page, PAGE_SIZE))) ++ return err; ++ page = dump_mem_next_page(dump_memdev); ++ } ++ if (len > 0) { ++ printk("Incomplete header saved in mem\n"); ++ return -ENOENT; ++ } ++ ++ if ((err = dump_dev_seek(0))) { ++ printk("Unable to seek to dump header offset\n"); ++ return err; ++ } ++ err = dump_ll_write(dump_config.dumper->dump_buf, ++ buf - dump_config.dumper->dump_buf); ++ if (err < dump_config.dumper->header_len) ++ return (err < 0) ? err : -ENOSPC; ++ ++ dump_config.dumper->header_dirty = 0; ++ return 0; ++} ++ ++static loff_t next_dph_offset = 0; ++ ++static int dph_valid(struct __dump_page *dph) ++{ ++ if ((dph->dp_address & (PAGE_SIZE - 1)) || (dph->dp_flags ++ > DUMP_DH_COMPRESSED) || (!dph->dp_flags) || ++ (dph->dp_size > PAGE_SIZE)) { ++ printk("dp->address = 0x%llx, dp->size = 0x%x, dp->flag = 0x%x\n", ++ dph->dp_address, dph->dp_size, dph->dp_flags); ++ return 0; ++ } ++ return 1; ++} ++ ++int dump_verify_lcrash_data(void *buf, unsigned long sz) ++{ ++ struct __dump_page *dph; ++ ++ /* sanity check for page headers */ ++ while (next_dph_offset + sizeof(*dph) < sz) { ++ dph = (struct __dump_page *)(buf + next_dph_offset); ++ if (!dph_valid(dph)) { ++ printk("Invalid page hdr at offset 0x%llx\n", ++ next_dph_offset); ++ return -EINVAL; ++ } ++ next_dph_offset += dph->dp_size + sizeof(*dph); ++ } ++ ++ next_dph_offset -= sz; ++ return 0; ++} ++ ++/* ++ * TBD/Later: Consider avoiding the copy by using a scatter/gather ++ * vector representation for the dump buffer ++ */ ++int dump_passthru_add_data(unsigned long loc, unsigned long sz) ++{ ++ struct page *page = (struct page *)loc; ++ void *buf = dump_config.dumper->curr_buf; ++ int err = 0; ++ ++ if ((err = dump_copy_pages(buf, page, sz))) { ++ printk("dump_copy_pages failed"); ++ return err; ++ } ++ ++ if ((err = dump_verify_lcrash_data(buf, sz))) { ++ printk("dump_verify_lcrash_data failed\n"); ++ printk("Invalid data for pfn 0x%lx\n", page_to_pfn(page)); ++ printk("Page flags 0x%lx\n", page->flags); ++ printk("Page count 0x%x\n", atomic_read(&page->count)); ++ return err; ++ } ++ ++ dump_config.dumper->curr_buf = buf + sz; ++ ++ return 0; ++} ++ ++ ++/* Stage 1 dumper: Saves compressed dump in memory and soft-boots system */ ++ ++/* Scheme to overlay saved data in memory for writeout after a soft-boot */ ++struct dump_scheme_ops dump_scheme_overlay_ops = { ++ .configure = dump_overlay_configure, ++ .unconfigure = dump_overlay_unconfigure, ++ .sequencer = dump_overlay_sequencer, ++ .iterator = dump_page_iterator, ++ .save_data = dump_overlay_save_data, ++ .skip_data = dump_overlay_skip_data, ++ .write_buffer = dump_generic_write_buffer ++}; ++ ++struct dump_scheme dump_scheme_overlay = { ++ .name = "overlay", ++ .ops = &dump_scheme_overlay_ops ++}; ++ ++ ++/* Stage 1 must use a good compression scheme - default to gzip */ ++extern struct __dump_compress dump_gzip_compression; ++ ++struct dumper dumper_stage1 = { ++ .name = "stage1", ++ .scheme = &dump_scheme_overlay, ++ .fmt = &dump_fmt_lcrash, ++ .compress = &dump_none_compression, /* needs to be gzip */ ++ .filter = dump_filter_table, ++ .dev = NULL, ++}; ++ ++/* Stage 2 dumper: Activated after softboot to write out saved dump to device */ ++ ++/* Formatter that transfers data as is (transparent) w/o further conversion */ ++struct dump_fmt_ops dump_fmt_passthru_ops = { ++ .configure_header = dump_passthru_configure_header, ++ .update_header = dump_passthru_update_header, ++ .save_context = NULL, /* unused */ ++ .add_data = dump_passthru_add_data, ++ .update_end_marker = dump_lcrash_update_end_marker ++}; ++ ++struct dump_fmt dump_fmt_passthru = { ++ .name = "passthru", ++ .ops = &dump_fmt_passthru_ops ++}; ++ ++/* Filter that simply passes along any data within the range (transparent)*/ ++/* Note: The start and end ranges in the table are filled in at run-time */ ++ ++extern int dump_filter_none(int pass, unsigned long loc, unsigned long sz); ++ ++struct dump_data_filter dump_passthru_filtertable[MAX_PASSES] = { ++{.name = "passkern", .selector = dump_passthru_filter, ++ .level_mask = DUMP_MASK_KERN }, ++{.name = "passuser", .selector = dump_passthru_filter, ++ .level_mask = DUMP_MASK_USED }, ++{.name = "passunused", .selector = dump_passthru_filter, ++ .level_mask = DUMP_MASK_UNUSED }, ++{.name = "none", .selector = dump_filter_none, ++ .level_mask = DUMP_MASK_REST } ++}; ++ ++ ++/* Scheme to handle data staged / preserved across a soft-boot */ ++struct dump_scheme_ops dump_scheme_staged_ops = { ++ .configure = dump_generic_configure, ++ .unconfigure = dump_staged_unconfigure, ++ .sequencer = dump_generic_sequencer, ++ .iterator = dump_saved_data_iterator, ++ .save_data = dump_generic_save_data, ++ .skip_data = dump_generic_skip_data, ++ .write_buffer = dump_generic_write_buffer ++}; ++ ++struct dump_scheme dump_scheme_staged = { ++ .name = "staged", ++ .ops = &dump_scheme_staged_ops ++}; ++ ++/* The stage 2 dumper comprising all these */ ++struct dumper dumper_stage2 = { ++ .name = "stage2", ++ .scheme = &dump_scheme_staged, ++ .fmt = &dump_fmt_passthru, ++ .compress = &dump_none_compression, ++ .filter = dump_passthru_filtertable, ++ .dev = NULL, ++}; ++ +--- linux-2.5.69/drivers/dump/dump_rle.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_rle.c Fri Dec 13 00:51:31 2002 +@@ -0,0 +1,175 @@ ++/* ++ * RLE Compression functions for kernel crash dumps. ++ * ++ * Created by: Matt Robinson (yakker@sourceforge.net) ++ * Copyright 2001 Matt D. Robinson. All rights reserved. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* header files */ ++#include <linux/config.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/file.h> ++#include <linux/init.h> ++#include <linux/dump.h> ++ ++/* ++ * Name: dump_compress_rle() ++ * Func: Compress a DUMP_PAGE_SIZE (hardware) page down to something more ++ * reasonable, if possible. This is the same routine we use in IRIX. ++ */ ++static u16 ++dump_compress_rle(const u8 *old, u16 oldsize, u8 *new, u16 newsize) ++{ ++ u16 ri, wi, count = 0; ++ u_char value = 0, cur_byte; ++ ++ /* ++ * If the block should happen to "compress" to larger than the ++ * buffer size, allocate a larger one and change cur_buf_size. ++ */ ++ ++ wi = ri = 0; ++ ++ while (ri < oldsize) { ++ if (!ri) { ++ cur_byte = value = old[ri]; ++ count = 0; ++ } else { ++ if (count == 255) { ++ if (wi + 3 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = 0; ++ new[wi++] = count; ++ new[wi++] = value; ++ value = cur_byte = old[ri]; ++ count = 0; ++ } else { ++ if ((cur_byte = old[ri]) == value) { ++ count++; ++ } else { ++ if (count > 1) { ++ if (wi + 3 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = 0; ++ new[wi++] = count; ++ new[wi++] = value; ++ } else if (count == 1) { ++ if (value == 0) { ++ if (wi + 3 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = 0; ++ new[wi++] = 1; ++ new[wi++] = 0; ++ } else { ++ if (wi + 2 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = value; ++ new[wi++] = value; ++ } ++ } else { /* count == 0 */ ++ if (value == 0) { ++ if (wi + 2 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = value; ++ new[wi++] = value; ++ } else { ++ if (wi + 1 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = value; ++ } ++ } /* if count > 1 */ ++ ++ value = cur_byte; ++ count = 0; ++ ++ } /* if byte == value */ ++ ++ } /* if count == 255 */ ++ ++ } /* if ri == 0 */ ++ ri++; ++ ++ } ++ if (count > 1) { ++ if (wi + 3 > oldsize) { ++ return oldsize; ++ } ++ new[wi++] = 0; ++ new[wi++] = count; ++ new[wi++] = value; ++ } else if (count == 1) { ++ if (value == 0) { ++ if (wi + 3 > oldsize) ++ return oldsize; ++ new[wi++] = 0; ++ new[wi++] = 1; ++ new[wi++] = 0; ++ } else { ++ if (wi + 2 > oldsize) ++ return oldsize; ++ new[wi++] = value; ++ new[wi++] = value; ++ } ++ } else { /* count == 0 */ ++ if (value == 0) { ++ if (wi + 2 > oldsize) ++ return oldsize; ++ new[wi++] = value; ++ new[wi++] = value; ++ } else { ++ if (wi + 1 > oldsize) ++ return oldsize; ++ new[wi++] = value; ++ } ++ } /* if count > 1 */ ++ ++ value = cur_byte; ++ count = 0; ++ return wi; ++} ++ ++/* setup the rle compression functionality */ ++static struct __dump_compress dump_rle_compression = { ++ .compress_type = DUMP_COMPRESS_RLE, ++ .compress_func = dump_compress_rle, ++ .compress_name = "RLE", ++}; ++ ++/* ++ * Name: dump_compress_rle_init() ++ * Func: Initialize rle compression for dumping. ++ */ ++static int __init ++dump_compress_rle_init(void) ++{ ++ dump_register_compression(&dump_rle_compression); ++ return 0; ++} ++ ++/* ++ * Name: dump_compress_rle_cleanup() ++ * Func: Remove rle compression for dumping. ++ */ ++static void __exit ++dump_compress_rle_cleanup(void) ++{ ++ dump_unregister_compression(DUMP_COMPRESS_RLE); ++} ++ ++/* module initialization */ ++module_init(dump_compress_rle_init); ++module_exit(dump_compress_rle_cleanup); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>"); ++MODULE_DESCRIPTION("RLE compression module for crash dump driver"); +--- linux-2.5.69/drivers/dump/dump_scheme.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_scheme.c Fri Apr 25 00:24:15 2003 +@@ -0,0 +1,357 @@ ++/* ++ * Default single stage dump scheme methods ++ * ++ * Previously a part of dump_base.c ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya <suparna@in.ibm.com> ++ * Split and rewrote LKCD dump scheme to generic dump method ++ * interfaces ++ * Derived from original code created by ++ * Matt Robinson <yakker@sourceforge.net>) ++ * ++ * Contributions from SGI, IBM, HP, MCL, and others. ++ * ++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* ++ * Implements the default dump scheme, i.e. single-stage gathering and ++ * saving of dump data directly to the target device, which operates in ++ * a push mode, where the dumping system decides what data it saves ++ * taking into account pre-specified dump config options. ++ * ++ * Aside: The 2-stage dump scheme, where there is a soft-reset between ++ * the gathering and saving phases, also reuses some of these ++ * default routines (see dump_overlay.c) ++ */ ++#include <linux/types.h> ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <linux/slab.h> ++#include <linux/delay.h> ++#include <linux/reboot.h> ++#include <linux/nmi.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++ ++extern int panic_timeout; /* time before reboot */ ++ ++extern void dump_speedo(int); ++ ++/* Default sequencer used during single stage dumping */ ++/* Also invoked during stage 2 of soft-boot based dumping */ ++int dump_generic_sequencer(void) ++{ ++ struct dump_data_filter *filter = dump_config.dumper->filter; ++ int pass = 0, err = 0, save = 0; ++ int (*action)(unsigned long, unsigned long); ++ ++ /* ++ * We want to save the more critical data areas first in ++ * case we run out of space, encounter i/o failures, or get ++ * interrupted otherwise and have to give up midway ++ * So, run through the passes in increasing order ++ */ ++ for (;filter->selector; filter++, pass++) ++ { ++ /* Assumes passes are exclusive (even across dumpers) */ ++ /* Requires care when coding the selection functions */ ++ if ((save = filter->level_mask & dump_config.level)) ++ action = dump_save_data; ++ else ++ action = dump_skip_data; ++ ++ if ((err = dump_iterator(pass, action, filter)) < 0) ++ break; ++ ++ printk("\n %d dump pages %s of %d each in pass %d\n", ++ err, save ? "saved" : "skipped", DUMP_PAGE_SIZE, pass); ++ ++ } ++ ++ return (err < 0) ? err : 0; ++} ++ ++static inline struct page *dump_get_page(loff_t loc) ++{ ++ unsigned long page_index = loc >> PAGE_SHIFT; ++ ++ /* todo: complete this to account for ia64/discontig mem */ ++ /* todo: and to check for validity, ram page, no i/o mem etc */ ++ /* need to use pfn/physaddr equiv of kern_addr_valid */ ++ if (__dump_page_valid(page_index)) ++ return pfn_to_page(page_index); ++ else ++ return NULL; ++ ++} ++ ++/* Default iterator: for singlestage and stage 1 of soft-boot dumping */ ++/* Iterates over range of physical memory pages in DUMP_PAGE_SIZE increments */ ++int dump_page_iterator(int pass, int (*action)(unsigned long, unsigned long), ++ struct dump_data_filter *filter) ++{ ++ /* Todo : fix unit, type */ ++ loff_t loc; ++ int count = 0, err = 0; ++ struct page *page; ++ ++ /* Todo: Add membanks code */ ++ /* TBD: Check if we need to address DUMP_PAGE_SIZE < PAGE_SIZE */ ++ ++ for (loc = filter->start; loc < filter->end; loc += DUMP_PAGE_SIZE) { ++ dump_config.dumper->curr_loc = loc; ++ page = dump_get_page(loc); ++ if (page && filter->selector(pass, (unsigned long) page, ++ DUMP_PAGE_SIZE)) { ++ if ((err = action((unsigned long)page, DUMP_PAGE_SIZE))) ++ { ++ printk("dump_page_iterator: err %d for loc " ++ "0x%llx, in pass %d\n", err, loc, pass); ++ break; ++ } else ++ count++; ++ } ++ } ++ ++ return err ? err : count; ++} ++ ++/* ++ * Base function that saves the selected block of data in the dump ++ * Action taken when iterator decides that data needs to be saved ++ */ ++int dump_generic_save_data(unsigned long loc, unsigned long sz) ++{ ++ void *buf; ++ void *dump_buf = dump_config.dumper->dump_buf; ++ int left, bytes, ret; ++ ++ if ((ret = dump_add_data(loc, sz))) { ++ return ret; ++ } ++ buf = dump_config.dumper->curr_buf; ++ ++ /* If we've filled up the buffer write it out */ ++ if ((left = buf - dump_buf) >= DUMP_BUFFER_SIZE) { ++ bytes = dump_write_buffer(dump_buf, DUMP_BUFFER_SIZE); ++ if (bytes < DUMP_BUFFER_SIZE) { ++ printk("dump_write_buffer failed %d\n", bytes); ++ return bytes ? -ENOSPC : bytes; ++ } ++ ++ left -= bytes; ++ ++ /* -- A few chores to do from time to time -- */ ++ dump_config.dumper->count++; ++ ++ if (!(dump_config.dumper->count & 0x3f)) { ++ /* Update the header every one in a while */ ++ memset((void *)dump_buf, 'b', DUMP_BUFFER_SIZE); ++ if ((ret = dump_update_header()) < 0) { ++ /* issue warning */ ++ return ret; ++ } ++ printk("."); ++ ++ touch_nmi_watchdog(); ++ } else if (!(dump_config.dumper->count & 0x7)) { ++ /* Show progress so the user knows we aren't hung */ ++ dump_speedo(dump_config.dumper->count >> 3); ++ } ++ /* Todo: Touch/Refresh watchdog */ ++ ++ /* --- Done with periodic chores -- */ ++ ++ /* ++ * extra bit of copying to simplify verification ++ * in the second kernel boot based scheme ++ */ ++ memcpy(dump_buf - DUMP_PAGE_SIZE, dump_buf + ++ DUMP_BUFFER_SIZE - DUMP_PAGE_SIZE, DUMP_PAGE_SIZE); ++ ++ /* now adjust the leftover bits back to the top of the page */ ++ /* this case would not arise during stage 2 (passthru) */ ++ memset(dump_buf, 'z', DUMP_BUFFER_SIZE); ++ if (left) { ++ memcpy(dump_buf, dump_buf + DUMP_BUFFER_SIZE, left); ++ } ++ buf -= DUMP_BUFFER_SIZE; ++ dump_config.dumper->curr_buf = buf; ++ } ++ ++ return 0; ++} ++ ++int dump_generic_skip_data(unsigned long loc, unsigned long sz) ++{ ++ /* dummy by default */ ++ return 0; ++} ++ ++/* ++ * Common low level routine to write a buffer to current dump device ++ * Expects checks for space etc to have been taken care of by the caller ++ * Operates serially at the moment for simplicity. ++ * TBD/Todo: Consider batching for improved throughput ++ */ ++int dump_ll_write(void *buf, unsigned long len) ++{ ++ long transferred = 0, last_transfer = 0; ++ int ret = 0; ++ ++ /* make sure device is ready */ ++ while ((ret = dump_dev_ready(NULL)) == -EAGAIN); ++ if (ret < 0) { ++ printk("dump_dev_ready failed !err %d\n", ret); ++ return ret; ++ } ++ ++ while (len) { ++ if ((last_transfer = dump_dev_write(buf, len)) <= 0) { ++ ret = last_transfer; ++ printk("dump_dev_write failed !err %d\n", ++ ret); ++ break; ++ } ++ /* wait till complete */ ++ while ((ret = dump_dev_ready(buf)) == -EAGAIN) ++ cpu_relax(); ++ ++ if (ret < 0) { ++ printk("i/o failed !err %d\n", ret); ++ break; ++ } ++ ++ len -= last_transfer; ++ buf += last_transfer; ++ transferred += last_transfer; ++ } ++ return (ret < 0) ? ret : transferred; ++} ++ ++/* default writeout routine for single dump device */ ++/* writes out the dump data ensuring enough space is left for the end marker */ ++int dump_generic_write_buffer(void *buf, unsigned long len) ++{ ++ long written = 0; ++ int err = 0; ++ ++ /* check for space */ ++ if ((err = dump_dev_seek(dump_config.dumper->curr_offset + len + ++ 2*DUMP_BUFFER_SIZE)) < 0) { ++ printk("dump_write_buffer: insuff space after offset 0x%llx\n", ++ dump_config.dumper->curr_offset); ++ return err; ++ } ++ /* alignment check would happen as a side effect of this */ ++ if ((err = dump_dev_seek(dump_config.dumper->curr_offset)) < 0) ++ return err; ++ ++ written = dump_ll_write(buf, len); ++ ++ /* all or none */ ++ ++ if (written < len) ++ written = written ? -ENOSPC : written; ++ else ++ dump_config.dumper->curr_offset += len; ++ ++ return written; ++} ++ ++int dump_generic_configure(unsigned long devid) ++{ ++ struct dump_dev *dev = dump_config.dumper->dev; ++ struct dump_data_filter *filter; ++ void *buf; ++ int ret = 0; ++ ++ /* Allocate the dump buffer and initialize dumper state */ ++ /* Assume that we get aligned addresses */ ++ if (!(buf = dump_alloc_mem(DUMP_BUFFER_SIZE + 3 * DUMP_PAGE_SIZE))) ++ return -ENOMEM; ++ ++ if ((unsigned long)buf & (PAGE_SIZE - 1)) { ++ /* sanity check for page aligned address */ ++ dump_free_mem(buf); ++ return -ENOMEM; /* fixme: better error code */ ++ } ++ ++ /* Initialize the rest of the fields */ ++ dump_config.dumper->dump_buf = buf + DUMP_PAGE_SIZE; ++ dumper_reset(); ++ ++ /* Open the dump device */ ++ if (!dev) ++ return -ENODEV; ++ ++ if ((ret = dev->ops->open(dev, devid))) { ++ return ret; ++ } ++ ++ /* Initialise the memory ranges in the dump filter */ ++ for (filter = dump_config.dumper->filter ;filter->selector; filter++) { ++ if (!filter->start && !filter->end) { ++ filter->start = 0; ++ filter->end = num_physpages << PAGE_SHIFT; ++ } ++ } ++ ++ return 0; ++} ++ ++int dump_generic_unconfigure(void) ++{ ++ struct dump_dev *dev = dump_config.dumper->dev; ++ void *buf = dump_config.dumper->dump_buf; ++ int ret = 0; ++ ++ pr_debug("Generic unconfigure\n"); ++ /* Close the dump device */ ++ if (dev && (ret = dev->ops->release(dev))) ++ return ret; ++ ++ printk("Closed dump device\n"); ++ ++ if (buf) ++ dump_free_mem((buf - DUMP_PAGE_SIZE)); ++ ++ dump_config.dumper->curr_buf = dump_config.dumper->dump_buf = NULL; ++ pr_debug("Released dump buffer\n"); ++ ++ return 0; ++} ++ ++ ++/* Set up the default dump scheme */ ++ ++struct dump_scheme_ops dump_scheme_singlestage_ops = { ++ .configure = dump_generic_configure, ++ .unconfigure = dump_generic_unconfigure, ++ .sequencer = dump_generic_sequencer, ++ .iterator = dump_page_iterator, ++ .save_data = dump_generic_save_data, ++ .skip_data = dump_generic_skip_data, ++ .write_buffer = dump_generic_write_buffer, ++}; ++ ++struct dump_scheme dump_scheme_singlestage = { ++ .name = "single-stage", ++ .ops = &dump_scheme_singlestage_ops ++}; ++ ++/* The single stage dumper comprising all these */ ++struct dumper dumper_singlestage = { ++ .name = "single-stage", ++ .scheme = &dump_scheme_singlestage, ++ .fmt = &dump_fmt_lcrash, ++ .compress = &dump_none_compression, ++ .filter = dump_filter_table, ++ .dev = NULL, ++}; ++ +--- linux-2.5.69/drivers/dump/dump_setup.c.lkcdbase Mon Jun 2 17:29:49 2003 ++++ linux-2.5.69/drivers/dump/dump_setup.c Tue Apr 29 03:37:19 2003 +@@ -0,0 +1,803 @@ ++/* ++ * Standard kernel function entry points for Linux crash dumps. ++ * ++ * Created by: Matt Robinson (yakker@sourceforge.net) ++ * Contributions from SGI, IBM, HP, MCL, and others. ++ * ++ * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * Copyright (C) 2000 - 2002 TurboLinux, Inc. All rights reserved. ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 Free Software Foundation, Inc. All rights reserved. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* ++ * ----------------------------------------------------------------------- ++ * ++ * DUMP HISTORY ++ * ++ * This dump code goes back to SGI's first attempts at dumping system ++ * memory on SGI systems running IRIX. A few developers at SGI needed ++ * a way to take this system dump and analyze it, and created 'icrash', ++ * or IRIX Crash. The mechanism (the dumps and 'icrash') were used ++ * by support people to generate crash reports when a system failure ++ * occurred. This was vital for large system configurations that ++ * couldn't apply patch after patch after fix just to hope that the ++ * problems would go away. So the system memory, along with the crash ++ * dump analyzer, allowed support people to quickly figure out what the ++ * problem was on the system with the crash dump. ++ * ++ * In comes Linux. SGI started moving towards the open source community, ++ * and upon doing so, SGI wanted to take its support utilities into Linux ++ * with the hopes that they would end up the in kernel and user space to ++ * be used by SGI's customers buying SGI Linux systems. One of the first ++ * few products to be open sourced by SGI was LKCD, or Linux Kernel Crash ++ * Dumps. LKCD comprises of a patch to the kernel to enable system ++ * dumping, along with 'lcrash', or Linux Crash, to analyze the system ++ * memory dump. A few additional system scripts and kernel modifications ++ * are also included to make the dump mechanism and dump data easier to ++ * process and use. ++ * ++ * As soon as LKCD was released into the open source community, a number ++ * of larger companies started to take advantage of it. Today, there are ++ * many community members that contribute to LKCD, and it continues to ++ * flourish and grow as an open source project. ++ */ ++ ++/* ++ * DUMP TUNABLES ++ * ++ * This is the list of system tunables (via /proc) that are available ++ * for Linux systems. All the read, write, etc., functions are listed ++ * here. Currently, there are a few different tunables for dumps: ++ * ++ * dump_device (used to be dumpdev): ++ * The device for dumping the memory pages out to. This ++ * may be set to the primary swap partition for disruptive dumps, ++ * and must be an unused partition for non-disruptive dumps. ++ * Todo: In the case of network dumps, this may be interpreted ++ * as the IP address of the netdump server to connect to. ++ * ++ * dump_compress (used to be dump_compress_pages): ++ * This is the flag which indicates which compression mechanism ++ * to use. This is a BITMASK, not an index (0,1,2,4,8,16,etc.). ++ * This is the current set of values: ++ * ++ * 0: DUMP_COMPRESS_NONE -- Don't compress any pages. ++ * 1: DUMP_COMPRESS_RLE -- This uses RLE compression. ++ * 2: DUMP_COMPRESS_GZIP -- This uses GZIP compression. ++ * ++ * dump_level: ++ * The amount of effort the dump module should make to save ++ * information for post crash analysis. This value is now ++ * a BITMASK value, not an index: ++ * ++ * 0: Do nothing, no dumping. (DUMP_LEVEL_NONE) ++ * ++ * 1: Print out the dump information to the dump header, and ++ * write it out to the dump_device. (DUMP_LEVEL_HEADER) ++ * ++ * 2: Write out the dump header and all kernel memory pages. ++ * (DUMP_LEVEL_KERN) ++ * ++ * 4: Write out the dump header and all kernel and user ++ * memory pages. (DUMP_LEVEL_USED) ++ * ++ * 8: Write out the dump header and all conventional/cached ++ * memory (RAM) pages in the system (kernel, user, free). ++ * (DUMP_LEVEL_ALL_RAM) ++ * ++ * 16: Write out everything, including non-conventional memory ++ * like firmware, proms, I/O registers, uncached memory. ++ * (DUMP_LEVEL_ALL) ++ * ++ * The dump_level will default to 1. ++ * ++ * dump_flags: ++ * These are the flags to use when talking about dumps. There ++ * are lots of possibilities. This is a BITMASK value, not an index. ++ * ++ * ----------------------------------------------------------------------- ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/reboot.h> ++#include <linux/fs.h> ++#include <linux/dump.h> ++#include "dump_methods.h" ++#include <linux/proc_fs.h> ++#include <linux/module.h> ++#include <linux/utsname.h> ++#include <linux/highmem.h> ++#include <linux/major.h> ++#include <linux/sysrq.h> ++#include <linux/sysctl.h> ++#include <linux/nmi.h> ++ ++#include <asm/hardirq.h> ++#include <asm/uaccess.h> ++ ++/* ++ * ----------------------------------------------------------------------- ++ * V A R I A B L E S ++ * ----------------------------------------------------------------------- ++ */ ++ ++/* Dump tunables */ ++struct dump_config dump_config = { ++ .level = 0, ++ .flags = 0, ++ .dump_device = 0, ++ .dump_addr = 0, ++ .dumper = NULL ++}; ++ ++ ++/* Global variables used in dump.h */ ++/* degree of system freeze when dumping */ ++enum dump_silence_levels dump_silence_level = DUMP_HARD_SPIN_CPUS; ++ ++/* Other global fields */ ++extern struct __dump_header dump_header; ++struct dump_dev *dump_dev = NULL; /* Active dump device */ ++static int dump_compress = 0; ++ ++static u16 dump_compress_none(const u8 *old, u16 oldsize, u8 *new, u16 newsize); ++struct __dump_compress dump_none_compression = { ++ .compress_type = DUMP_COMPRESS_NONE, ++ .compress_func = dump_compress_none, ++ .compress_name = "none", ++}; ++ ++/* our device operations and functions */ ++static int dump_ioctl(struct inode *i, struct file *f, ++ unsigned int cmd, unsigned long arg); ++ ++static struct file_operations dump_fops = { ++ .ioctl = dump_ioctl, ++}; ++ ++/* static variables */ ++static int dump_okay = 0; /* can we dump out to disk? */ ++static spinlock_t dump_lock = SPIN_LOCK_UNLOCKED; ++ ++/* used for dump compressors */ ++static struct list_head dump_compress_list = LIST_HEAD_INIT(dump_compress_list); ++ ++/* list of registered dump targets */ ++static struct list_head dump_target_list = LIST_HEAD_INIT(dump_target_list); ++ ++/* lkcd info structure -- this is used by lcrash for basic system data */ ++struct __lkcdinfo lkcdinfo = { ++ .ptrsz = (sizeof(void *) * 8), ++#if defined(__LITTLE_ENDIAN) ++ .byte_order = __LITTLE_ENDIAN, ++#else ++ .byte_order = __BIG_ENDIAN, ++#endif ++ .page_shift = PAGE_SHIFT, ++ .page_size = PAGE_SIZE, ++ .page_mask = PAGE_MASK, ++ .page_offset = PAGE_OFFSET, ++}; ++ ++/* ++ * ----------------------------------------------------------------------- ++ * / P R O C T U N A B L E F U N C T I O N S ++ * ----------------------------------------------------------------------- ++ */ ++ ++static int proc_dump_device(ctl_table *ctl, int write, struct file *f, ++ void *buffer, size_t *lenp); ++ ++static int proc_doulonghex(ctl_table *ctl, int write, struct file *f, ++ void *buffer, size_t *lenp); ++/* ++ * sysctl-tuning infrastructure. ++ */ ++static ctl_table dump_table[] = { ++ { .ctl_name = CTL_DUMP_LEVEL, ++ .procname = DUMP_LEVEL_NAME, ++ .data = &dump_config.level, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = proc_doulonghex, }, ++ ++ { .ctl_name = CTL_DUMP_FLAGS, ++ .procname = DUMP_FLAGS_NAME, ++ .data = &dump_config.flags, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = proc_doulonghex, }, ++ ++ { .ctl_name = CTL_DUMP_COMPRESS, ++ .procname = DUMP_COMPRESS_NAME, ++ .data = &dump_compress, /* FIXME */ ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = proc_dointvec, }, ++ ++ { .ctl_name = CTL_DUMP_DEVICE, ++ .procname = DUMP_DEVICE_NAME, ++ .mode = 0644, ++ .data = &dump_config.dump_device, /* FIXME */ ++ .maxlen = sizeof(int), ++ .proc_handler = proc_dump_device }, ++ ++#ifdef CONFIG_CRASH_DUMP_MEMDEV ++ { .ctl_name = CTL_DUMP_ADDR, ++ .procname = DUMP_ADDR_NAME, ++ .mode = 0444, ++ .data = &dump_config.dump_addr, ++ .maxlen = sizeof(unsigned long), ++ .proc_handler = proc_doulonghex }, ++#endif ++ ++ { 0, } ++}; ++ ++static ctl_table dump_root[] = { ++ { .ctl_name = KERN_DUMP, ++ .procname = "dump", ++ .mode = 0555, ++ .child = dump_table }, ++ { 0, } ++}; ++ ++static ctl_table kernel_root[] = { ++ { .ctl_name = CTL_KERN, ++ .procname = "kernel", ++ .mode = 0555, ++ .child = dump_root, }, ++ { 0, } ++}; ++ ++static struct ctl_table_header *sysctl_header; ++ ++/* ++ * ----------------------------------------------------------------------- ++ * C O M P R E S S I O N F U N C T I O N S ++ * ----------------------------------------------------------------------- ++ */ ++ ++/* ++ * Name: dump_compress_none() ++ * Func: Don't do any compression, period. ++ */ ++static u16 ++dump_compress_none(const u8 *old, u16 oldsize, u8 *new, u16 newsize) ++{ ++ /* just return the old size */ ++ return oldsize; ++} ++ ++ ++/* ++ * Name: dump_execute() ++ * Func: Execute the dumping process. This makes sure all the appropriate ++ * fields are updated correctly, and calls dump_execute_memdump(), ++ * which does the real work. ++ */ ++void ++dump_execute(const char *panic_str, const struct pt_regs *regs) ++{ ++ int state = -1; ++ unsigned long flags; ++ ++ /* make sure we can dump */ ++ if (!dump_okay) { ++ pr_info("LKCD not yet configured, can't take dump now\n"); ++ return; ++ } ++ ++ /* Exclude multiple dumps at the same time, ++ * and disable interrupts, some drivers may re-enable ++ * interrupts in with silence() ++ * ++ * Try and acquire spin lock. If successful, leave preempt ++ * and interrupts disabled. See spin_lock_irqsave in spinlock.h ++ */ ++ local_irq_save(flags); ++ if (!spin_trylock(&dump_lock)) { ++ local_irq_restore(flags); ++ pr_info("LKCD dump already in progress\n"); ++ return; ++ } ++ ++ /* Bring system into the strictest level of quiescing for min drift ++ * dump drivers can soften this as required in dev->ops->silence() ++ */ ++ dump_oncpu = smp_processor_id() + 1; ++ dump_silence_level = DUMP_HARD_SPIN_CPUS; ++ ++ state = dump_generic_execute(panic_str, regs); ++ ++ dump_oncpu = 0; ++ spin_unlock_irqrestore(&dump_lock, flags); ++ ++ if (state < 0) { ++ printk("Dump Incomplete or failed!\n"); ++ } else { ++ printk("Dump Complete; %d dump pages saved.\n", ++ dump_header.dh_num_dump_pages); ++ } ++} ++ ++/* ++ * Name: dump_register_compression() ++ * Func: Register a dump compression mechanism. ++ */ ++void ++dump_register_compression(struct __dump_compress *item) ++{ ++ if (item) ++ list_add(&(item->list), &dump_compress_list); ++} ++ ++/* ++ * Name: dump_unregister_compression() ++ * Func: Remove a dump compression mechanism, and re-assign the dump ++ * compression pointer if necessary. ++ */ ++void ++dump_unregister_compression(int compression_type) ++{ ++ struct list_head *tmp; ++ struct __dump_compress *dc; ++ ++ /* let's make sure our list is valid */ ++ if (compression_type != DUMP_COMPRESS_NONE) { ++ list_for_each(tmp, &dump_compress_list) { ++ dc = list_entry(tmp, struct __dump_compress, list); ++ if (dc->compress_type == compression_type) { ++ list_del(&(dc->list)); ++ break; ++ } ++ } ++ } ++} ++ ++/* ++ * Name: dump_compress_init() ++ * Func: Initialize (or re-initialize) compression scheme. ++ */ ++static int ++dump_compress_init(int compression_type) ++{ ++ struct list_head *tmp; ++ struct __dump_compress *dc; ++ ++ /* try to remove the compression item */ ++ list_for_each(tmp, &dump_compress_list) { ++ dc = list_entry(tmp, struct __dump_compress, list); ++ if (dc->compress_type == compression_type) { ++ dump_config.dumper->compress = dc; ++ dump_compress = compression_type; ++ pr_debug("Dump Compress %s\n", dc->compress_name); ++ return 0; ++ } ++ } ++ ++ /* ++ * nothing on the list -- return ENODATA to indicate an error ++ * ++ * NB: ++ * EAGAIN: reports "Resource temporarily unavailable" which ++ * isn't very enlightening. ++ */ ++ printk("compression_type:%d not found\n", compression_type); ++ ++ return -ENODATA; ++} ++ ++static int ++dumper_setup(unsigned long flags, unsigned long devid) ++{ ++ int ret = 0; ++ ++ /* unconfigure old dumper if it exists */ ++ dump_okay = 0; ++ if (dump_config.dumper) { ++ pr_debug("Unconfiguring current dumper\n"); ++ dump_unconfigure(); ++ } ++ /* set up new dumper */ ++ if (dump_config.flags & DUMP_FLAGS_SOFTBOOT) { ++ printk("Configuring softboot based dump \n"); ++#ifdef CONFIG_CRASH_DUMP_MEMDEV ++ dump_config.dumper = &dumper_stage1; ++#else ++ printk("Requires CONFIG_CRASHDUMP_MEMDEV. Can't proceed.\n"); ++ return -1; ++#endif ++ } else { ++ dump_config.dumper = &dumper_singlestage; ++ } ++ dump_config.dumper->dev = dump_dev; ++ ++ ret = dump_configure(devid); ++ if (!ret) { ++ dump_okay = 1; ++ pr_debug("%s dumper set up for dev 0x%lx\n", ++ dump_config.dumper->name, devid); ++ dump_config.dump_device = devid; ++ } else { ++ printk("%s dumper set up failed for dev 0x%lx\n", ++ dump_config.dumper->name, devid); ++ dump_config.dumper = NULL; ++ } ++ return ret; ++} ++ ++static int ++dump_target_init(int target) ++{ ++ char type[20]; ++ struct list_head *tmp; ++ struct dump_dev *dev; ++ ++ switch (target) { ++ case DUMP_FLAGS_DISKDUMP: ++ strcpy(type, "blockdev"); break; ++ case DUMP_FLAGS_NETDUMP: ++ strcpy(type, "networkdev"); break; ++ default: ++ return -1; ++ } ++ ++ /* ++ * This is a bit stupid, generating strings from flag ++ * and doing strcmp. This is done because 'struct dump_dev' ++ * has string 'type_name' and not interger 'type'. ++ */ ++ list_for_each(tmp, &dump_target_list) { ++ dev = list_entry(tmp, struct dump_dev, list); ++ if (strcmp(type, dev->type_name) == 0) { ++ dump_dev = dev; ++ return 0; ++ } ++ } ++ return -1; ++} ++ ++/* ++ * Name: dump_ioctl() ++ * Func: Allow all dump tunables through a standard ioctl() mechanism. ++ * This is far better than before, where we'd go through /proc, ++ * because now this will work for multiple OS and architectures. ++ */ ++static int ++dump_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg) ++{ ++ /* check capabilities */ ++ if (!capable(CAP_SYS_ADMIN)) ++ return -EPERM; ++ ++ if (!dump_config.dumper && cmd == DIOSDUMPCOMPRESS) ++ /* dump device must be configured first */ ++ return -ENODEV; ++ ++ /* ++ * This is the main mechanism for controlling get/set data ++ * for various dump device parameters. The real trick here ++ * is setting the dump device (DIOSDUMPDEV). That's what ++ * triggers everything else. ++ */ ++ switch (cmd) { ++ case DIOSDUMPDEV: /* set dump_device */ ++ pr_debug("Configuring dump device\n"); ++ if (!(f->f_flags & O_RDWR)) ++ return -EPERM; ++ ++ __dump_open(); ++ return dumper_setup(dump_config.flags, arg); ++ ++ ++ case DIOGDUMPDEV: /* get dump_device */ ++ return put_user((long)dump_config.dump_device, (long *)arg); ++ ++ case DIOSDUMPLEVEL: /* set dump_level */ ++ if (!(f->f_flags & O_RDWR)) ++ return -EPERM; ++ ++ /* make sure we have a positive value */ ++ if (arg < 0) ++ return -EINVAL; ++ ++ /* Fixme: clean this up */ ++ dump_config.level = 0; ++ switch ((int)arg) { ++ case DUMP_LEVEL_ALL: ++ case DUMP_LEVEL_ALL_RAM: ++ dump_config.level |= DUMP_MASK_UNUSED; ++ case DUMP_LEVEL_USED: ++ dump_config.level |= DUMP_MASK_USED; ++ case DUMP_LEVEL_KERN: ++ dump_config.level |= DUMP_MASK_KERN; ++ case DUMP_LEVEL_HEADER: ++ dump_config.level |= DUMP_MASK_HEADER; ++ case DUMP_LEVEL_NONE: ++ break; ++ default: ++ return (-EINVAL); ++ } ++ pr_debug("Dump Level 0x%lx\n", dump_config.level); ++ break; ++ ++ case DIOGDUMPLEVEL: /* get dump_level */ ++ /* fixme: handle conversion */ ++ return put_user((long)dump_config.level, (long *)arg); ++ ++ ++ case DIOSDUMPFLAGS: /* set dump_flags */ ++ /* check flags */ ++ if (!(f->f_flags & O_RDWR)) ++ return -EPERM; ++ ++ /* make sure we have a positive value */ ++ if (arg < 0) ++ return -EINVAL; ++ ++ if (dump_target_init(arg & DUMP_FLAGS_TARGETMASK) < 0) ++ return -EINVAL; /* return proper error */ ++ ++ dump_config.flags = arg; ++ ++ pr_debug("Dump Flags 0x%lx\n", dump_config.flags); ++ break; ++ ++ case DIOGDUMPFLAGS: /* get dump_flags */ ++ return put_user((long)dump_config.flags, (long *)arg); ++ ++ case DIOSDUMPCOMPRESS: /* set the dump_compress status */ ++ if (!(f->f_flags & O_RDWR)) ++ return -EPERM; ++ ++ return dump_compress_init((int)arg); ++ ++ case DIOGDUMPCOMPRESS: /* get the dump_compress status */ ++ return put_user((long)(dump_config.dumper ? ++ dump_config.dumper->compress->compress_type : 0), ++ (long *)arg); ++ ++ default: ++ /* ++ * these are network dump specific ioctls, let the ++ * module handle them. ++ */ ++ return dump_dev_ioctl(cmd, arg); ++ } ++ return 0; ++} ++ ++/* ++ * Handle special cases for dump_device ++ * changing dump device requires doing an opening the device ++ */ ++static int ++proc_dump_device(ctl_table *ctl, int write, struct file *f, ++ void *buffer, size_t *lenp) ++{ ++ int *valp = ctl->data; ++ int oval = *valp; ++ int ret = -EPERM; ++ ++ /* same permission checks as ioctl */ ++ if (capable(CAP_SYS_ADMIN)) { ++ ret = proc_doulonghex(ctl, write, f, buffer, lenp); ++ if (ret == 0 && write && *valp != oval) { ++ /* need to restore old value to close properly */ ++ dump_config.dump_device = (dev_t) oval; ++ __dump_open(); ++ ret = dumper_setup(dump_config.flags, (dev_t) *valp); ++ } ++ } ++ ++ return ret; ++} ++ ++/* All for the want of a proc_do_xxx routine which prints values in hex */ ++static int ++proc_doulonghex(ctl_table *ctl, int write, struct file *f, ++ void *buffer, size_t *lenp) ++{ ++#define TMPBUFLEN 20 ++ unsigned long *i; ++ size_t len, left; ++ char buf[TMPBUFLEN]; ++ ++ if (!ctl->data || !ctl->maxlen || !*lenp || (f->f_pos)) { ++ *lenp = 0; ++ return 0; ++ } ++ ++ i = (unsigned long *) ctl->data; ++ left = *lenp; ++ ++ sprintf(buf, "0x%lx\n", (*i)); ++ len = strlen(buf); ++ if (len > left) ++ len = left; ++ if(copy_to_user(buffer, buf, len)) ++ return -EFAULT; ++ ++ left -= len; ++ *lenp -= left; ++ f->f_pos += *lenp; ++ return 0; ++} ++ ++/* ++ * ----------------------------------------------------------------------- ++ * I N I T F U N C T I O N S ++ * ----------------------------------------------------------------------- ++ */ ++ ++/* ++ * These register and unregister routines are exported for modules ++ * to register their dump drivers (like block, net etc) ++ */ ++int ++dump_register_device(struct dump_dev *ddev) ++{ ++ struct list_head *tmp; ++ struct dump_dev *dev; ++ ++ list_for_each(tmp, &dump_target_list) { ++ dev = list_entry(tmp, struct dump_dev, list); ++ if (strcmp(ddev->type_name, dev->type_name) == 0) { ++ printk("Target type %s already registered\n", ++ dev->type_name); ++ return -1; /* return proper error */ ++ } ++ } ++ list_add(&(ddev->list), &dump_target_list); ++ ++ return 0; ++} ++ ++void ++dump_unregister_device(struct dump_dev *ddev) ++{ ++ list_del(&(ddev->list)); ++ if (ddev != dump_dev) ++ return; ++ ++ dump_okay = 0; ++ ++ if (dump_config.dumper) ++ dump_unconfigure(); ++ ++ dump_config.flags &= ~DUMP_FLAGS_TARGETMASK; ++ dump_okay = 0; ++ dump_dev = NULL; ++ dump_config.dumper = NULL; ++} ++ ++static int panic_event(struct notifier_block *this, unsigned long event, ++ void *ptr) ++{ ++ struct pt_regs regs; ++ ++ get_current_regs(®s); ++ dump_execute((const char *)ptr, ®s); ++ return 0; ++} ++ ++extern struct notifier_block *panic_notifier_list; ++static int panic_event(struct notifier_block *, unsigned long, void *); ++static struct notifier_block panic_block = { ++ .notifier_call = panic_event, ++}; ++ ++#ifdef CONFIG_MAGIC_SYSRQ ++/* Sysrq handler */ ++static void sysrq_handle_crashdump(int key, struct pt_regs *pt_regs, ++ struct tty_struct *tty) { ++ dump_execute("sysrq", pt_regs); ++} ++ ++static struct sysrq_key_op sysrq_crashdump_op = { ++ .handler = sysrq_handle_crashdump, ++ .help_msg = "Dump", ++ .action_msg = "Starting crash dump", ++}; ++#endif ++ ++static inline void ++dump_sysrq_register(void) ++{ ++#ifdef CONFIG_MAGIC_SYSRQ ++ __sysrq_lock_table(); ++ __sysrq_put_key_op(DUMP_SYSRQ_KEY, &sysrq_crashdump_op); ++ __sysrq_unlock_table(); ++#endif ++} ++ ++static inline void ++dump_sysrq_unregister(void) ++{ ++#ifdef CONFIG_MAGIC_SYSRQ ++ __sysrq_lock_table(); ++ if (__sysrq_get_key_op(DUMP_SYSRQ_KEY) == &sysrq_crashdump_op) ++ __sysrq_put_key_op(DUMP_SYSRQ_KEY, NULL); ++ __sysrq_unlock_table(); ++#endif ++} ++ ++/* ++ * Name: dump_init() ++ * Func: Initialize the dump process. This will set up any architecture ++ * dependent code. The big key is we need the memory offsets before ++ * the page table is initialized, because the base memory offset ++ * is changed after paging_init() is called. ++ */ ++static int __init ++dump_init(void) ++{ ++ struct sysinfo info; ++ ++ /* try to create our dump device */ ++ if (register_chrdev(CRASH_DUMP_MAJOR, "dump", &dump_fops)) { ++ printk("cannot register dump character device!\n"); ++ return -EBUSY; ++ } ++ ++ __dump_init((u64)PAGE_OFFSET); ++ ++ /* set the dump_compression_list structure up */ ++ dump_register_compression(&dump_none_compression); ++ ++ /* grab the total memory size now (not if/when we crash) */ ++ si_meminfo(&info); ++ ++ /* set the memory size */ ++ dump_header.dh_memory_size = (u64)info.totalram; ++ ++ sysctl_header = register_sysctl_table(kernel_root, 0); ++ dump_sysrq_register(); ++ ++ notifier_chain_register(&panic_notifier_list, &panic_block); ++ dump_function_ptr = dump_execute; ++ ++ pr_info("Crash dump driver initialized.\n"); ++ return 0; ++} ++ ++static void __exit ++dump_cleanup(void) ++{ ++ dump_okay = 0; ++ ++ if (dump_config.dumper) ++ dump_unconfigure(); ++ ++ /* arch-specific cleanup routine */ ++ __dump_cleanup(); ++ ++ /* ignore errors while unregistering -- since can't do anything */ ++ unregister_sysctl_table(sysctl_header); ++ unregister_chrdev(CRASH_DUMP_MAJOR, "dump"); ++ dump_sysrq_unregister(); ++ notifier_chain_unregister(&panic_notifier_list, &panic_block); ++ dump_function_ptr = NULL; ++} ++ ++EXPORT_SYMBOL(dump_register_compression); ++EXPORT_SYMBOL(dump_unregister_compression); ++EXPORT_SYMBOL(dump_register_device); ++EXPORT_SYMBOL(dump_unregister_device); ++EXPORT_SYMBOL(dump_config); ++EXPORT_SYMBOL(dump_silence_level); ++ ++EXPORT_SYMBOL(__dump_irq_enable); ++EXPORT_SYMBOL(__dump_irq_restore); ++ ++MODULE_AUTHOR("Matt D. Robinson <yakker@sourceforge.net>"); ++MODULE_DESCRIPTION("Linux Kernel Crash Dump (LKCD) driver"); ++MODULE_LICENSE("GPL"); ++ ++module_init(dump_init); ++module_exit(dump_cleanup); +--- linux-2.5.69/include/linux/dumpdev.h.lkcdbase Mon Jun 2 17:28:52 2003 ++++ linux-2.5.69/include/linux/dumpdev.h Mon Jun 2 17:31:01 2003 +@@ -0,0 +1,161 @@ ++/* ++ * Generic dump device interfaces for flexible system dump ++ * (Enables variation of dump target types e.g disk, network, memory) ++ * ++ * These interfaces have evolved based on discussions on lkcd-devel. ++ * Eventually the intent is to support primary and secondary or ++ * alternate targets registered at the same time, with scope for ++ * situation based failover or multiple dump devices used for parallel ++ * dump i/o. ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya (suparna@in.ibm.com) ++ * ++ * Copyright (C) 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++#ifndef _LINUX_DUMPDEV_H ++#define _LINUX_DUMPDEV_H ++ ++#include <linux/kernel.h> ++#include <linux/wait.h> ++#include <linux/bio.h> ++ ++/* Determined by the dump target (device) type */ ++ ++struct dump_dev; ++ ++struct dump_dev_ops { ++ int (*open)(struct dump_dev *, unsigned long); /* configure */ ++ int (*release)(struct dump_dev *); /* unconfigure */ ++ int (*silence)(struct dump_dev *); /* when dump starts */ ++ int (*resume)(struct dump_dev *); /* when dump is over */ ++ int (*seek)(struct dump_dev *, loff_t); ++ /* trigger a write (async in nature typically) */ ++ int (*write)(struct dump_dev *, void *, unsigned long); ++ /* not usually used during dump, but option available */ ++ int (*read)(struct dump_dev *, void *, unsigned long); ++ /* use to poll for completion */ ++ int (*ready)(struct dump_dev *, void *); ++ int (*ioctl)(struct dump_dev *, unsigned int, unsigned long); ++}; ++ ++struct dump_dev { ++ char type_name[32]; /* block, net-poll etc */ ++ unsigned long device_id; /* interpreted differently for various types */ ++ struct dump_dev_ops *ops; ++ struct list_head list; ++ loff_t curr_offset; ++}; ++ ++/* ++ * dump_dev type variations: ++ */ ++ ++/* block */ ++struct dump_blockdev { ++ struct dump_dev ddev; ++ kdev_t kdev_id; ++ struct block_device *bdev; ++ struct bio *bio; ++ loff_t start_offset; ++ loff_t limit; ++ int err; ++}; ++ ++static inline struct dump_blockdev *DUMP_BDEV(struct dump_dev *dev) ++{ ++ return container_of(dev, struct dump_blockdev, ddev); ++} ++ ++ ++/* mem - for internal use by soft-boot based dumper */ ++struct dump_memdev { ++ struct dump_dev ddev; ++ unsigned long indirect_map_root; ++ unsigned long nr_free; ++ struct page *curr_page; ++ unsigned long *curr_map; ++ unsigned long curr_map_offset; ++ unsigned long last_offset; ++ unsigned long last_used_offset; ++ unsigned long last_bs_offset; ++}; ++ ++static inline struct dump_memdev *DUMP_MDEV(struct dump_dev *dev) ++{ ++ return container_of(dev, struct dump_memdev, ddev); ++} ++ ++/* Todo/future - meant for raw dedicated interfaces e.g. mini-ide driver */ ++struct dump_rdev { ++ struct dump_dev ddev; ++ char name[32]; ++ int (*reset)(struct dump_rdev *, unsigned int, ++ unsigned long); ++ /* ... to do ... */ ++}; ++ ++/* just to get the size right when saving config across a soft-reboot */ ++struct dump_anydev { ++ union { ++ struct dump_blockdev bddev; ++ /* .. add other types here .. */ ++ }; ++}; ++ ++ ++ ++/* Dump device / target operation wrappers */ ++/* These assume that dump_dev is initiatized to dump_config.dumper->dev */ ++ ++extern struct dump_dev *dump_dev; ++ ++static inline int dump_dev_open(unsigned long arg) ++{ ++ return dump_dev->ops->open(dump_dev, arg); ++} ++ ++static inline int dump_dev_release(void) ++{ ++ return dump_dev->ops->release(dump_dev); ++} ++ ++static inline int dump_dev_silence(void) ++{ ++ return dump_dev->ops->silence(dump_dev); ++} ++ ++static inline int dump_dev_resume(void) ++{ ++ return dump_dev->ops->resume(dump_dev); ++} ++ ++static inline int dump_dev_seek(loff_t offset) ++{ ++ return dump_dev->ops->seek(dump_dev, offset); ++} ++ ++static inline int dump_dev_write(void *buf, unsigned long len) ++{ ++ return dump_dev->ops->write(dump_dev, buf, len); ++} ++ ++static inline int dump_dev_ready(void *buf) ++{ ++ return dump_dev->ops->ready(dump_dev, buf); ++} ++ ++static inline int dump_dev_ioctl(unsigned int cmd, unsigned long arg) ++{ ++ if (!dump_dev->ops->ioctl) ++ return -EINVAL; ++ return dump_dev->ops->ioctl(dump_dev, cmd, arg); ++} ++ ++extern int dump_register_device(struct dump_dev *); ++extern void dump_unregister_device(struct dump_dev *); ++ ++#endif /* _LINUX_DUMPDEV_H */ +--- linux-2.5.69/include/linux/dump.h.lkcdbase Mon Jun 2 17:28:56 2003 ++++ linux-2.5.69/include/linux/dump.h Mon Jun 2 17:31:01 2003 +@@ -0,0 +1,376 @@ ++/* ++ * Kernel header file for Linux crash dumps. ++ * ++ * Created by: Matt Robinson (yakker@sgi.com) ++ * Copyright 1999 - 2002 Silicon Graphics, Inc. All rights reserved. ++ * ++ * vmdump.h to dump.h by: Matt D. Robinson (yakker@sourceforge.net) ++ * Copyright 2001 - 2002 Matt D. Robinson. All rights reserved. ++ * Copyright (C) 2002 Free Software Foundation, Inc. All rights reserved. ++ * ++ * Most of this is the same old stuff from vmdump.h, except now we're ++ * actually a stand-alone driver plugged into the block layer interface, ++ * with the exception that we now allow for compression modes externally ++ * loaded (e.g., someone can come up with their own). ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* This header file includes all structure definitions for crash dumps. */ ++#ifndef _DUMP_H ++#define _DUMP_H ++ ++#if defined(CONFIG_CRASH_DUMP) || defined (CONFIG_CRASH_DUMP_MODULE) ++ ++#include <linux/list.h> ++#include <linux/notifier.h> ++#include <linux/dumpdev.h> ++ ++/* ++ * Predefine default DUMP_PAGE constants, asm header may override. ++ * ++ * On ia64 discontinuous memory systems it's possible for the memory ++ * banks to stop at 2**12 page alignments, the smallest possible page ++ * size. But the system page size, PAGE_SIZE, is in fact larger. ++ */ ++#define DUMP_PAGE_SHIFT PAGE_SHIFT ++#define DUMP_PAGE_MASK PAGE_MASK ++#define DUMP_PAGE_ALIGN(addr) PAGE_ALIGN(addr) ++#define DUMP_HEADER_OFFSET PAGE_SIZE ++ ++/* keep DUMP_PAGE_SIZE constant to 4K = 1<<12 ++ * it may be different from PAGE_SIZE then. ++ */ ++#define DUMP_PAGE_SIZE 4096 ++ ++/* ++ * Predefined default memcpy() to use when copying memory to the dump buffer. ++ * ++ * On ia64 there is a heads up function that can be called to let the prom ++ * machine check monitor know that the current activity is risky and it should ++ * ignore the fault (nofault). In this case the ia64 header will redefine this ++ * macro to __dump_memcpy() and use it's arch specific version. ++ */ ++#define DUMP_memcpy memcpy ++ ++/* necessary header files */ ++#include <asm/dump.h> /* for architecture-specific header */ ++ ++/* ++ * Size of the buffer that's used to hold: ++ * ++ * 1. the dump header (padded to fill the complete buffer) ++ * 2. the possibly compressed page headers and data ++ */ ++#define DUMP_BUFFER_SIZE (64 * 1024) /* size of dump buffer */ ++#define DUMP_HEADER_SIZE DUMP_BUFFER_SIZE ++ ++/* standard header definitions */ ++#define DUMP_MAGIC_NUMBER 0xa8190173618f23edULL /* dump magic number */ ++#define DUMP_MAGIC_LIVE 0xa8190173618f23cdULL /* live magic number */ ++#define DUMP_VERSION_NUMBER 0x8 /* dump version number */ ++#define DUMP_PANIC_LEN 0x100 /* dump panic string length */ ++ ++/* dump levels - type specific stuff added later -- add as necessary */ ++#define DUMP_LEVEL_NONE 0x0 /* no dumping at all -- just bail */ ++#define DUMP_LEVEL_HEADER 0x1 /* kernel dump header only */ ++#define DUMP_LEVEL_KERN 0x2 /* dump header and kernel pages */ ++#define DUMP_LEVEL_USED 0x4 /* dump header, kernel/user pages */ ++#define DUMP_LEVEL_ALL_RAM 0x8 /* dump header, all RAM pages */ ++#define DUMP_LEVEL_ALL 0x10 /* dump all memory RAM and firmware */ ++ ++ ++/* dump compression options -- add as necessary */ ++#define DUMP_COMPRESS_NONE 0x0 /* don't compress this dump */ ++#define DUMP_COMPRESS_RLE 0x1 /* use RLE compression */ ++#define DUMP_COMPRESS_GZIP 0x2 /* use GZIP compression */ ++ ++/* dump flags - any dump-type specific flags -- add as necessary */ ++#define DUMP_FLAGS_NONE 0x0 /* no flags are set for this dump */ ++#define DUMP_FLAGS_SOFTBOOT 0x2 /* 2 stage soft-boot based dump */ ++ ++#define DUMP_FLAGS_TARGETMASK 0xf0000000 /* handle special case targets */ ++#define DUMP_FLAGS_DISKDUMP 0x80000000 /* dump to local disk */ ++#define DUMP_FLAGS_NETDUMP 0x40000000 /* dump over the network */ ++ ++/* dump header flags -- add as necessary */ ++#define DUMP_DH_FLAGS_NONE 0x0 /* no flags set (error condition!) */ ++#define DUMP_DH_RAW 0x1 /* raw page (no compression) */ ++#define DUMP_DH_COMPRESSED 0x2 /* page is compressed */ ++#define DUMP_DH_END 0x4 /* end marker on a full dump */ ++#define DUMP_DH_TRUNCATED 0x8 /* dump is incomplete */ ++#define DUMP_DH_TEST_PATTERN 0x10 /* dump page is a test pattern */ ++#define DUMP_DH_NOT_USED 0x20 /* 1st bit not used in flags */ ++ ++/* names for various dump parameters in /proc/kernel */ ++#define DUMP_ROOT_NAME "sys/dump" ++#define DUMP_DEVICE_NAME "device" ++#define DUMP_COMPRESS_NAME "compress" ++#define DUMP_LEVEL_NAME "level" ++#define DUMP_FLAGS_NAME "flags" ++#define DUMP_ADDR_NAME "addr" ++ ++#define DUMP_SYSRQ_KEY 'd' /* key to use for MAGIC_SYSRQ key */ ++ ++/* CTL_DUMP names: */ ++enum ++{ ++ CTL_DUMP_DEVICE=1, ++ CTL_DUMP_COMPRESS=3, ++ CTL_DUMP_LEVEL=3, ++ CTL_DUMP_FLAGS=4, ++ CTL_DUMP_ADDR=5, ++ CTL_DUMP_TEST=6, ++}; ++ ++ ++/* page size for gzip compression -- buffered slightly beyond hardware PAGE_SIZE used by DUMP */ ++#define DUMP_DPC_PAGE_SIZE (DUMP_PAGE_SIZE + 512) ++ ++/* dump ioctl() control options */ ++#define DIOSDUMPDEV 1 /* set the dump device */ ++#define DIOGDUMPDEV 2 /* get the dump device */ ++#define DIOSDUMPLEVEL 3 /* set the dump level */ ++#define DIOGDUMPLEVEL 4 /* get the dump level */ ++#define DIOSDUMPFLAGS 5 /* set the dump flag parameters */ ++#define DIOGDUMPFLAGS 6 /* get the dump flag parameters */ ++#define DIOSDUMPCOMPRESS 7 /* set the dump compress level */ ++#define DIOGDUMPCOMPRESS 8 /* get the dump compress level */ ++ ++/* these ioctls are used only by netdump module */ ++#define DIOSTARGETIP 9 /* set the target m/c's ip */ ++#define DIOGTARGETIP 10 /* get the target m/c's ip */ ++#define DIOSTARGETPORT 11 /* set the target m/c's port */ ++#define DIOGTARGETPORT 12 /* get the target m/c's port */ ++#define DIOSSOURCEPORT 13 /* set the source m/c's port */ ++#define DIOGSOURCEPORT 14 /* get the source m/c's port */ ++#define DIOSETHADDR 15 /* set ethernet address */ ++#define DIOGETHADDR 16 /* get ethernet address */ ++ ++/* ++ * Structure: __dump_header ++ * Function: This is the header dumped at the top of every valid crash ++ * dump. ++ */ ++struct __dump_header { ++ /* the dump magic number -- unique to verify dump is valid */ ++ u64 dh_magic_number; ++ ++ /* the version number of this dump */ ++ u32 dh_version; ++ ++ /* the size of this header (in case we can't read it) */ ++ u32 dh_header_size; ++ ++ /* the level of this dump (just a header?) */ ++ u32 dh_dump_level; ++ ++ /* ++ * We assume dump_page_size to be 4K in every case. ++ * Store here the configurable system page size (4K, 8K, 16K, etc.) ++ */ ++ u32 dh_page_size; ++ ++ /* the size of all physical memory */ ++ u64 dh_memory_size; ++ ++ /* the start of physical memory */ ++ u64 dh_memory_start; ++ ++ /* the end of physical memory */ ++ u64 dh_memory_end; ++ ++ /* the number of hardware/physical pages in this dump specifically */ ++ u32 dh_num_dump_pages; ++ ++ /* the panic string, if available */ ++ char dh_panic_string[DUMP_PANIC_LEN]; ++ ++ /* timeval depends on architecture, two long values */ ++ struct { ++ u64 tv_sec; ++ u64 tv_usec; ++ } dh_time; /* the time of the system crash */ ++ ++ /* the NEW utsname (uname) information -- in character form */ ++ /* we do this so we don't have to include utsname.h */ ++ /* plus it helps us be more architecture independent */ ++ /* now maybe one day soon they'll make the [65] a #define! */ ++ char dh_utsname_sysname[65]; ++ char dh_utsname_nodename[65]; ++ char dh_utsname_release[65]; ++ char dh_utsname_version[65]; ++ char dh_utsname_machine[65]; ++ char dh_utsname_domainname[65]; ++ ++ /* the address of current task (OLD = void *, NEW = u64) */ ++ u64 dh_current_task; ++ ++ /* what type of compression we're using in this dump (if any) */ ++ u32 dh_dump_compress; ++ ++ /* any additional flags */ ++ u32 dh_dump_flags; ++ ++ /* any additional flags */ ++ u32 dh_dump_device; ++} __attribute__((packed)); ++ ++/* ++ * Structure: __dump_page ++ * Function: To act as the header associated to each physical page of ++ * memory saved in the system crash dump. This allows for ++ * easy reassembly of each crash dump page. The address bits ++ * are split to make things easier for 64-bit/32-bit system ++ * conversions. ++ * ++ * dp_byte_offset and dp_page_index are landmarks that are helpful when ++ * looking at a hex dump of /dev/vmdump, ++ */ ++struct __dump_page { ++ /* the address of this dump page */ ++ u64 dp_address; ++ ++ /* the size of this dump page */ ++ u32 dp_size; ++ ++ /* flags (currently DUMP_COMPRESSED, DUMP_RAW or DUMP_END) */ ++ u32 dp_flags; ++} __attribute__((packed)); ++ ++/* ++ * Structure: __lkcdinfo ++ * Function: This structure contains information needed for the lkcdutils ++ * package (particularly lcrash) to determine what information is ++ * associated to this kernel, specifically. ++ */ ++struct __lkcdinfo { ++ int arch; ++ int ptrsz; ++ int byte_order; ++ int linux_release; ++ int page_shift; ++ int page_size; ++ u64 page_mask; ++ u64 page_offset; ++ int stack_offset; ++}; ++ ++#ifdef __KERNEL__ ++ ++/* ++ * Structure: __dump_compress ++ * Function: This is what an individual compression mechanism can use ++ * to plug in their own compression techniques. It's always ++ * best to build these as individual modules so that people ++ * can put in whatever they want. ++ */ ++struct __dump_compress { ++ /* the list_head structure for list storage */ ++ struct list_head list; ++ ++ /* the type of compression to use (DUMP_COMPRESS_XXX) */ ++ int compress_type; ++ const char *compress_name; ++ ++ /* the compression function to call */ ++ u16 (*compress_func)(const u8 *, u16, u8 *, u16); ++}; ++ ++/* functions for dump compression registration */ ++extern void dump_register_compression(struct __dump_compress *); ++extern void dump_unregister_compression(int); ++ ++/* ++ * Structure dump_mbank[]: ++ * ++ * For CONFIG_DISCONTIGMEM systems this array specifies the ++ * memory banks/chunks that need to be dumped after a panic. ++ * ++ * For classic systems it specifies a single set of pages from ++ * 0 to max_mapnr. ++ */ ++struct __dump_mbank { ++ u64 start; ++ u64 end; ++ int type; ++ int pad1; ++ long pad2; ++}; ++ ++#define DUMP_MBANK_TYPE_CONVENTIONAL_MEMORY 1 ++#define DUMP_MBANK_TYPE_OTHER 2 ++ ++#define MAXCHUNKS 256 ++extern int dump_mbanks; ++extern struct __dump_mbank dump_mbank[MAXCHUNKS]; ++ ++/* notification event codes */ ++#define DUMP_BEGIN 0x0001 /* dump beginning */ ++#define DUMP_END 0x0002 /* dump ending */ ++ ++/* Scheduler soft spin control. ++ * ++ * 0 - no dump in progress ++ * 1 - cpu0 is dumping, ... ++ */ ++extern unsigned long dump_oncpu; ++extern void dump_execute(const char *, const struct pt_regs *); ++ ++/* ++ * Notifier list for kernel code which wants to be called ++ * at kernel dump. ++ */ ++extern struct notifier_block *dump_notifier_list; ++static inline int register_dump_notifier(struct notifier_block *nb) ++{ ++ return notifier_chain_register(&dump_notifier_list, nb); ++} ++static inline int unregister_dump_notifier(struct notifier_block * nb) ++{ ++ return notifier_chain_unregister(&dump_notifier_list, nb); ++} ++ ++extern void (*dump_function_ptr)(const char *, const struct pt_regs *); ++static inline void dump(char * str, struct pt_regs * regs) ++{ ++ if (dump_function_ptr) ++ dump_function_ptr(str, regs); ++} ++ ++/* ++ * Common Arch Specific Functions should be declared here. ++ * This allows the C compiler to detect discrepancies. ++ */ ++extern void __dump_open(void); ++extern void __dump_cleanup(void); ++extern void __dump_init(u64); ++extern void __dump_save_regs(struct pt_regs *, const struct pt_regs *); ++extern int __dump_configure_header(const struct pt_regs *); ++extern void __dump_irq_enable(void); ++extern void __dump_irq_restore(void); ++extern int __dump_page_valid(unsigned long index); ++#ifdef CONFIG_SMP ++extern void __dump_save_other_cpus(void); ++#else ++#define __dump_save_other_cpus() ++#endif ++ ++/* to track all used (compound + zero order) pages */ ++#define PageInuse(p) (PageCompound(p) || page_count(p)) ++ ++#endif /* __KERNEL__ */ ++ ++#else /* !CONFIG_CRASH_DUMP */ ++ ++/* If not configured then make code disappear! */ ++#define register_dump_watchdog(x) do { } while(0) ++#define unregister_dump_watchdog(x) do { } while(0) ++#define register_dump_notifier(x) do { } while(0) ++#define unregister_dump_notifier(x) do { } while(0) ++#define dump_in_progress() 0 ++#define dump(x, y) do { } while(0) ++ ++#endif /* !CONFIG_CRASH_DUMP */ ++ ++#endif /* _DUMP_H */ +--- linux-2.5.69/include/linux/dump_netdev.h.lkcdbase Mon Jun 2 17:29:01 2003 ++++ linux-2.5.69/include/linux/dump_netdev.h Mon Jun 2 17:31:01 2003 +@@ -0,0 +1,80 @@ ++/* ++ * linux/drivers/net/netconsole.h ++ * ++ * Copyright (C) 2001 Ingo Molnar <mingo@redhat.com> ++ * ++ * This file contains the implementation of an IRQ-safe, crash-safe ++ * kernel console implementation that outputs kernel messages to the ++ * network. ++ * ++ * Modification history: ++ * ++ * 2001-09-17 started by Ingo Molnar. ++ */ ++ ++/**************************************************************** ++ * 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. ++ * ++ * 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 NETCONSOLE_VERSION 0x03 ++ ++enum netdump_commands { ++ COMM_NONE = 0, ++ COMM_SEND_MEM = 1, ++ COMM_EXIT = 2, ++ COMM_REBOOT = 3, ++ COMM_HELLO = 4, ++ COMM_GET_NR_PAGES = 5, ++ COMM_GET_PAGE_SIZE = 6, ++ COMM_START_NETDUMP_ACK = 7, ++ COMM_GET_REGS = 8, ++ COMM_GET_MAGIC = 9, ++ COMM_START_WRITE_NETDUMP_ACK = 10, ++}; ++ ++typedef struct netdump_req_s { ++ u64 magic; ++ u32 nr; ++ u32 command; ++ u32 from; ++ u32 to; ++} req_t; ++ ++enum netdump_replies { ++ REPLY_NONE = 0, ++ REPLY_ERROR = 1, ++ REPLY_LOG = 2, ++ REPLY_MEM = 3, ++ REPLY_RESERVED = 4, ++ REPLY_HELLO = 5, ++ REPLY_NR_PAGES = 6, ++ REPLY_PAGE_SIZE = 7, ++ REPLY_START_NETDUMP = 8, ++ REPLY_END_NETDUMP = 9, ++ REPLY_REGS = 10, ++ REPLY_MAGIC = 11, ++ REPLY_START_WRITE_NETDUMP = 12, ++}; ++ ++typedef struct netdump_reply_s { ++ u32 nr; ++ u32 code; ++ u32 info; ++} reply_t; ++ ++#define HEADER_LEN (1 + sizeof(reply_t)) ++ ++ +--- linux-2.5.69/include/asm-i386/dump.h.lkcdbase Mon Jun 2 17:28:47 2003 ++++ linux-2.5.69/include/asm-i386/dump.h Mon Jun 2 17:31:10 2003 +@@ -0,0 +1,93 @@ ++/* ++ * Kernel header file for Linux crash dumps. ++ * ++ * Created by: Matt Robinson (yakker@sgi.com) ++ * ++ * Copyright 1999 Silicon Graphics, Inc. All rights reserved. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++/* This header file holds the architecture specific crash dump header */ ++#ifndef _ASM_DUMP_H ++#define _ASM_DUMP_H ++ ++/* necessary header files */ ++#include <asm/ptrace.h> ++#include <asm/page.h> ++#include <linux/threads.h> ++#include <linux/mm.h> ++ ++/* definitions */ ++#define DUMP_ASM_MAGIC_NUMBER 0xdeaddeadULL /* magic number */ ++#define DUMP_ASM_VERSION_NUMBER 0x3 /* version number */ ++ ++/* max number of cpus */ ++#define DUMP_MAX_NUM_CPUS 32 ++ ++/* ++ * Structure: __dump_header_asm ++ * Function: This is the header for architecture-specific stuff. It ++ * follows right after the dump header. ++ */ ++struct __dump_header_asm { ++ /* the dump magic number -- unique to verify dump is valid */ ++ u64 dha_magic_number; ++ ++ /* the version number of this dump */ ++ u32 dha_version; ++ ++ /* the size of this header (in case we can't read it) */ ++ u32 dha_header_size; ++ ++ /* the esp for i386 systems */ ++ u32 dha_esp; ++ ++ /* the eip for i386 systems */ ++ u32 dha_eip; ++ ++ /* the dump registers */ ++ struct pt_regs dha_regs; ++ ++ /* smp specific */ ++ u32 dha_smp_num_cpus; ++ u32 dha_dumping_cpu; ++ struct pt_regs dha_smp_regs[DUMP_MAX_NUM_CPUS]; ++ u32 dha_smp_current_task[DUMP_MAX_NUM_CPUS]; ++ u32 dha_stack[DUMP_MAX_NUM_CPUS]; ++ u32 dha_stack_ptr[DUMP_MAX_NUM_CPUS]; ++} __attribute__((packed)); ++ ++#ifdef __KERNEL__ ++ ++extern struct __dump_header_asm dump_header_asm; ++ ++#ifdef CONFIG_SMP ++extern unsigned long irq_affinity[]; ++extern int (*dump_ipi_function_ptr)(struct pt_regs *); ++extern void dump_send_ipi(void); ++#else ++#define dump_send_ipi() do { } while(0) ++#endif ++ ++static inline void get_current_regs(struct pt_regs *regs) ++{ ++ __asm__ __volatile__("movl %%ebx,%0" : "=m"(regs->ebx)); ++ __asm__ __volatile__("movl %%ecx,%0" : "=m"(regs->ecx)); ++ __asm__ __volatile__("movl %%edx,%0" : "=m"(regs->edx)); ++ __asm__ __volatile__("movl %%esi,%0" : "=m"(regs->esi)); ++ __asm__ __volatile__("movl %%edi,%0" : "=m"(regs->edi)); ++ __asm__ __volatile__("movl %%ebp,%0" : "=m"(regs->ebp)); ++ __asm__ __volatile__("movl %%eax,%0" : "=m"(regs->eax)); ++ __asm__ __volatile__("movl %%esp,%0" : "=m"(regs->esp)); ++ __asm__ __volatile__("movw %%ss, %%ax;" :"=a"(regs->xss)); ++ __asm__ __volatile__("movw %%cs, %%ax;" :"=a"(regs->xcs)); ++ __asm__ __volatile__("movw %%ds, %%ax;" :"=a"(regs->xds)); ++ __asm__ __volatile__("movw %%es, %%ax;" :"=a"(regs->xes)); ++ __asm__ __volatile__("pushfl; popl %0" :"=m"(regs->eflags)); ++ regs->eip = (unsigned long)current_text_addr(); ++} ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* _ASM_DUMP_H */ +--- linux-2.5.69/init/kerntypes.c.lkcdbase Mon Jun 2 17:29:10 2003 ++++ linux-2.5.69/init/kerntypes.c Mon Jun 2 17:29:06 2003 +@@ -0,0 +1,31 @@ ++/* ++ * kerntypes.c ++ * ++ * Copyright (C) 2000 Tom Morano (tjm@sgi.com) and ++ * Matt D. Robinson (yakker@alacritech.com) ++ * ++ * Dummy module that includes headers for all kernel types of interest. ++ * The kernel type information is used by the lcrash utility when ++ * analyzing system crash dumps or the live system. Using the type ++ * information for the running system, rather than kernel header files, ++ * makes for a more flexible and robust analysis tool. ++ * ++ * This source code is released under version 2 of the GNU GPL. ++ */ ++ ++#include <linux/compile.h> ++#include <linux/module.h> ++#include <linux/mm.h> ++#include <linux/config.h> ++#include <linux/utsname.h> ++#include <linux/dump.h> ++ ++#ifdef LINUX_COMPILE_VERSION_ID_TYPE ++/* Define version type for version validation of dump and kerntypes */ ++LINUX_COMPILE_VERSION_ID_TYPE; ++#endif ++ ++void ++kerntypes_dummy(void) ++{ ++} +--- linux-2.5.69/drivers/dump/dump_methods.h.lkcdbase Mon Jun 2 17:56:12 2003 ++++ linux-2.5.69/drivers/dump/dump_methods.h Mon Jun 2 17:55:51 2003 +@@ -0,0 +1,348 @@ ++/* ++ * Generic interfaces for flexible system dump ++ * ++ * Started: Oct 2002 - Suparna Bhattacharya (suparna@in.ibm.com) ++ * ++ * Copyright (C) 2002 International Business Machines Corp. ++ * ++ * This code is released under version 2 of the GNU GPL. ++ */ ++ ++#ifndef _LINUX_DUMP_METHODS_H ++#define _LINUX_DUMP_METHODS_H ++ ++/* ++ * Inspired by Matt Robinson's suggestion of introducing dump ++ * methods as a way to enable different crash dump facilities to ++ * coexist where each employs its own scheme or dumping policy. ++ * ++ * The code here creates a framework for flexible dump by defining ++ * a set of methods and providing associated helpers that differentiate ++ * between the underlying mechanism (how to dump), overall scheme ++ * (sequencing of stages and data dumped and associated quiescing), ++ * output format (what the dump output looks like), target type ++ * (where to save the dump; see dumpdev.h), and selection policy ++ * (state/data to dump). ++ * ++ * These sets of interfaces can be mixed and matched to build a ++ * dumper suitable for a given situation, allowing for ++ * flexibility as well appropriate degree of code reuse. ++ * For example all features and options of lkcd (including ++ * granular selective dumping in the near future) should be ++ * available even when say, the 2 stage soft-boot based mechanism ++ * is used for taking disruptive dumps. ++ * ++ * Todo: Additionally modules or drivers may supply their own ++ * custom dumpers which extend dump with module specific ++ * information or hardware state, and can even tweak the ++ * mechanism when it comes to saving state relevant to ++ * them. ++ */ ++ ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/highmem.h> ++#include <linux/dumpdev.h> ++ ++#define MAX_PASSES 6 ++#define MAX_DEVS 4 ++ ++ ++/* To customise selection of pages to be dumped in a given pass/group */ ++struct dump_data_filter{ ++ char name[32]; ++ int (*selector)(int, unsigned long, unsigned long); ++ ulong level_mask; /* dump level(s) for which this filter applies */ ++ loff_t start, end; /* location range applicable */ ++}; ++ ++ ++/* ++ * Determined by the kind of dump mechanism and appropriate ++ * overall scheme ++ */ ++struct dump_scheme_ops { ++ /* sets aside memory, inits data structures etc */ ++ int (*configure)(unsigned long devid); ++ /* releases resources */ ++ int (*unconfigure)(void); ++ ++ /* ordering of passes, invoking iterator */ ++ int (*sequencer)(void); ++ /* iterates over system data, selects and acts on data to dump */ ++ int (*iterator)(int, int (*)(unsigned long, unsigned long), ++ struct dump_data_filter *); ++ /* action when data is selected for dump */ ++ int (*save_data)(unsigned long, unsigned long); ++ /* action when data is to be excluded from dump */ ++ int (*skip_data)(unsigned long, unsigned long); ++ /* policies for space, multiple dump devices etc */ ++ int (*write_buffer)(void *, unsigned long); ++}; ++ ++struct dump_scheme { ++ /* the name serves as an anchor to locate the scheme after reboot */ ++ char name[32]; ++ struct dump_scheme_ops *ops; ++ struct list_head list; ++}; ++ ++/* Quiescing/Silence levels (controls IPI callback behaviour) */ ++extern enum dump_silence_levels { ++ DUMP_SOFT_SPIN_CPUS = 1, ++ DUMP_HARD_SPIN_CPUS = 2, ++ DUMP_HALT_CPUS = 3, ++} dump_silence_level; ++ ++/* determined by the dump (file) format */ ++struct dump_fmt_ops { ++ /* build header */ ++ int (*configure_header)(const char *, const struct pt_regs *); ++ int (*update_header)(void); /* update header and write it out */ ++ /* save curr context */ ++ void (*save_context)(int, const struct pt_regs *, ++ struct task_struct *); ++ /* typically called by the save_data action */ ++ /* add formatted data to the dump buffer */ ++ int (*add_data)(unsigned long, unsigned long); ++ int (*update_end_marker)(void); ++}; ++ ++struct dump_fmt { ++ unsigned long magic; ++ char name[32]; /* lcrash, crash, elf-core etc */ ++ struct dump_fmt_ops *ops; ++ struct list_head list; ++}; ++ ++/* ++ * Modules will be able add their own data capture schemes by ++ * registering their own dumpers. Typically they would use the ++ * primary dumper as a template and tune it with their routines. ++ * Still Todo. ++ */ ++ ++/* The combined dumper profile (mechanism, scheme, dev, fmt) */ ++struct dumper { ++ char name[32]; /* singlestage, overlay (stg1), passthru(stg2), pull */ ++ struct dump_scheme *scheme; ++ struct dump_fmt *fmt; ++ struct __dump_compress *compress; ++ struct dump_data_filter *filter; ++ struct dump_dev *dev; ++ /* state valid only for active dumper(s) - per instance */ ++ /* run time state/context */ ++ int curr_pass; ++ unsigned long count; ++ loff_t curr_offset; /* current logical offset into dump device */ ++ loff_t curr_loc; /* current memory location */ ++ void *curr_buf; /* current position in the dump buffer */ ++ void *dump_buf; /* starting addr of dump buffer */ ++ int header_dirty; /* whether the header needs to be written out */ ++ int header_len; ++ struct list_head dumper_list; /* links to other dumpers */ ++}; ++ ++/* Starting point to get to the current configured state */ ++struct dump_config { ++ ulong level; ++ ulong flags; ++ struct dumper *dumper; ++ unsigned long dump_device; ++ unsigned long dump_addr; /* relevant only for in-memory dumps */ ++ struct list_head dump_dev_list; ++}; ++ ++extern struct dump_config dump_config; ++ ++/* Used to save the dump config across a reboot for 2-stage dumps: ++ * ++ * Note: The scheme, format, compression and device type should be ++ * registered at bootup, for this config to be sharable across soft-boot. ++ * The function addresses could have changed and become invalid, and ++ * need to be set up again. ++ */ ++struct dump_config_block { ++ u64 magic; /* for a quick sanity check after reboot */ ++ struct dump_memdev memdev; /* handle to dump stored in memory */ ++ struct dump_config config; ++ struct dumper dumper; ++ struct dump_scheme scheme; ++ struct dump_fmt fmt; ++ struct __dump_compress compress; ++ struct dump_data_filter filter_table[MAX_PASSES]; ++ struct dump_anydev dev[MAX_DEVS]; /* target dump device */ ++}; ++ ++ ++/* Wrappers that invoke the methods for the current (active) dumper */ ++ ++/* Scheme operations */ ++ ++static inline int dump_sequencer(void) ++{ ++ return dump_config.dumper->scheme->ops->sequencer(); ++} ++ ++static inline int dump_iterator(int pass, int (*action)(unsigned long, ++ unsigned long), struct dump_data_filter *filter) ++{ ++ return dump_config.dumper->scheme->ops->iterator(pass, action, filter); ++} ++ ++#define dump_save_data dump_config.dumper->scheme->ops->save_data ++#define dump_skip_data dump_config.dumper->scheme->ops->skip_data ++ ++static inline int dump_write_buffer(void *buf, unsigned long len) ++{ ++ return dump_config.dumper->scheme->ops->write_buffer(buf, len); ++} ++ ++static inline int dump_configure(unsigned long devid) ++{ ++ return dump_config.dumper->scheme->ops->configure(devid); ++} ++ ++static inline int dump_unconfigure(void) ++{ ++ return dump_config.dumper->scheme->ops->unconfigure(); ++} ++ ++/* Format operations */ ++ ++static inline int dump_configure_header(const char *panic_str, ++ const struct pt_regs *regs) ++{ ++ return dump_config.dumper->fmt->ops->configure_header(panic_str, regs); ++} ++ ++static inline void dump_save_context(int cpu, const struct pt_regs *regs, ++ struct task_struct *tsk) ++{ ++ dump_config.dumper->fmt->ops->save_context(cpu, regs, tsk); ++} ++ ++static inline int dump_save_this_cpu(const struct pt_regs *regs) ++{ ++ int cpu = smp_processor_id(); ++ ++ dump_save_context(cpu, regs, current); ++ return 1; ++} ++ ++static inline int dump_update_header(void) ++{ ++ return dump_config.dumper->fmt->ops->update_header(); ++} ++ ++static inline int dump_update_end_marker(void) ++{ ++ return dump_config.dumper->fmt->ops->update_end_marker(); ++} ++ ++static inline int dump_add_data(unsigned long loc, unsigned long sz) ++{ ++ return dump_config.dumper->fmt->ops->add_data(loc, sz); ++} ++ ++/* Compression operation */ ++static inline int dump_compress_data(char *src, int slen, char *dst) ++{ ++ return dump_config.dumper->compress->compress_func(src, slen, ++ dst, DUMP_DPC_PAGE_SIZE); ++} ++ ++ ++/* Prototypes of some default implementations of dump methods */ ++ ++extern struct __dump_compress dump_none_compression; ++ ++/* Default scheme methods (dump_scheme.c) */ ++ ++extern int dump_generic_sequencer(void); ++extern int dump_page_iterator(int pass, int (*action)(unsigned long, unsigned ++ long), struct dump_data_filter *filter); ++extern int dump_generic_save_data(unsigned long loc, unsigned long sz); ++extern int dump_generic_skip_data(unsigned long loc, unsigned long sz); ++extern int dump_generic_write_buffer(void *buf, unsigned long len); ++extern int dump_generic_configure(unsigned long); ++extern int dump_generic_unconfigure(void); ++ ++/* Default scheme template */ ++extern struct dump_scheme dump_scheme_singlestage; ++ ++/* Default dump format methods */ ++ ++extern int dump_lcrash_configure_header(const char *panic_str, ++ const struct pt_regs *regs); ++extern void dump_lcrash_save_context(int cpu, const struct pt_regs *regs, ++ struct task_struct *tsk); ++extern int dump_generic_update_header(void); ++extern int dump_lcrash_add_data(unsigned long loc, unsigned long sz); ++extern int dump_lcrash_update_end_marker(void); ++ ++/* Default format (lcrash) template */ ++extern struct dump_fmt dump_fmt_lcrash; ++ ++/* Default dump selection filter table */ ++ ++/* ++ * Entries listed in order of importance and correspond to passes ++ * The last entry (with a level_mask of zero) typically reflects data that ++ * won't be dumped -- this may for example be used to identify data ++ * that will be skipped for certain so the corresponding memory areas can be ++ * utilized as scratch space. ++ */ ++extern struct dump_data_filter dump_filter_table[]; ++ ++/* Some pre-defined dumpers */ ++extern struct dumper dumper_singlestage; ++extern struct dumper dumper_stage1; ++extern struct dumper dumper_stage2; ++ ++/* These are temporary */ ++#define DUMP_MASK_HEADER DUMP_LEVEL_HEADER ++#define DUMP_MASK_KERN DUMP_LEVEL_KERN ++#define DUMP_MASK_USED DUMP_LEVEL_USED ++#define DUMP_MASK_UNUSED DUMP_LEVEL_ALL_RAM ++#define DUMP_MASK_REST 0 /* dummy for now */ ++ ++/* Helpers - move these to dump.h later ? */ ++ ++int dump_generic_execute(const char *panic_str, const struct pt_regs *regs); ++extern int dump_ll_write(void *buf, unsigned long len); ++int dump_check_and_free_page(struct dump_memdev *dev, struct page *page); ++ ++static inline void dumper_reset(void) ++{ ++ dump_config.dumper->curr_buf = dump_config.dumper->dump_buf; ++ dump_config.dumper->curr_loc = 0; ++ dump_config.dumper->curr_offset = 0; ++ dump_config.dumper->count = 0; ++ dump_config.dumper->curr_pass = 0; ++} ++ ++/* ++ * May later be moulded to perform boot-time allocations so we can dump ++ * earlier during bootup ++ */ ++static inline void *dump_alloc_mem(unsigned long size) ++{ ++ return kmalloc(size, GFP_KERNEL); ++} ++ ++static inline void dump_free_mem(void *buf) ++{ ++ struct page *page; ++ ++ /* ignore reserved pages (e.g. post soft boot stage) */ ++ if (buf && (page = virt_to_page(buf))) { ++ if (PageReserved(page)) ++ return; ++ } ++ ++ kfree(buf); ++} ++ ++ ++#endif /* _LINUX_DUMP_METHODS_H */ diff --git a/lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch new file mode 100644 index 0000000000..ebe09e893c --- /dev/null +++ b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.5.73.patch @@ -0,0 +1,608 @@ + + + + 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 | 10 +++++ + 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 | 3 + + include/asm-i386/mach-default/irq_vectors.h | 1 + include/asm-i386/smp.h | 1 + include/linux/major.h | 2 + + include/linux/sysctl.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 +- + 25 files changed, 207 insertions(+), 17 deletions(-) + +--- linux-2.5.73/drivers/Makefile~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:08 2003 ++++ linux-2.5.73-n9560/drivers/Makefile Mon Jun 30 14:56:26 2003 +@@ -50,3 +50,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.5.73/include/linux/major.h~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:37 2003 ++++ linux-2.5.73-n9560/include/linux/major.h Mon Jun 30 14:56:26 2003 +@@ -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.5.73/include/linux/sysctl.h~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:55 2003 ++++ linux-2.5.73-n9560/include/linux/sysctl.h Mon Jun 30 14:56:26 2003 +@@ -130,6 +130,8 @@ enum + KERN_PIDMAX=55, /* int: PID # limit */ + KERN_CORE_PATTERN=56, /* string: pattern for core-file names */ + KERN_PANIC_ON_OOPS=57, /* int: whether we will panic on an oops */ ++ ++ KERN_DUMP=60, /* directory: dump parameters */ + }; + + +--- linux-2.5.73/include/asm-i386/mach-default/irq_vectors.h~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:38 2003 ++++ linux-2.5.73-n9560/include/asm-i386/mach-default/irq_vectors.h Mon Jun 30 14:56:26 2003 +@@ -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.5.73/include/asm-i386/kmap_types.h~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:01 2003 ++++ linux-2.5.73-n9560/include/asm-i386/kmap_types.h Mon Jun 30 14:56:26 2003 +@@ -24,7 +24,8 @@ D(10) KM_IRQ0, + D(11) KM_IRQ1, + D(12) KM_SOFTIRQ0, + D(13) KM_SOFTIRQ1, +-D(14) KM_TYPE_NR ++D(14) KM_TYPE_NR, ++D(15) KM_DUMP + }; + + #undef D +--- linux-2.5.73/include/asm-i386/smp.h~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:56 2003 ++++ linux-2.5.73-n9560/include/asm-i386/smp.h Mon Jun 30 14:56:26 2003 +@@ -39,6 +39,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.5.73/arch/i386/kernel/i386_ksyms.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:35 2003 ++++ linux-2.5.73-n9560/arch/i386/kernel/i386_ksyms.c Mon Jun 30 14:56:26 2003 +@@ -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; +@@ -208,3 +210,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.5.73/arch/i386/kernel/nmi.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:55 2003 ++++ linux-2.5.73-n9560/arch/i386/kernel/nmi.c Mon Jun 30 14:56:26 2003 +@@ -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> +@@ -426,6 +427,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.5.73/arch/i386/kernel/setup.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:44 2003 ++++ linux-2.5.73-n9560/arch/i386/kernel/setup.c Mon Jun 30 14:56:26 2003 +@@ -438,6 +438,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) + { +@@ -531,6 +532,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; +@@ -913,6 +917,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; +@@ -977,6 +983,10 @@ void __init setup_arch(char **cmdline_p) + generic_apic_probe(*cmdline_p); + #endif + ++#ifdef CONFIG_CRASH_DUMP_SOFTBOOT ++ crashdump_reserve(); /* Preserve crash dump state from prev boot */ ++#endif ++ + #ifdef CONFIG_ACPI_BOOT + /* + * Parse the ACPI tables for possible boot-time SMP configuration. +--- linux-2.5.73/arch/i386/kernel/smp.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:32 2003 ++++ linux-2.5.73-n9560/arch/i386/kernel/smp.c Mon Jun 30 16:01:58 2003 +@@ -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. + */ +@@ -450,6 +458,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 +@@ -528,7 +541,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: +@@ -589,4 +602,3 @@ asmlinkage void smp_call_function_interr + atomic_inc(&call_data->finished); + } + } +- +--- linux-2.5.73/arch/i386/kernel/traps.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:35 2003 ++++ linux-2.5.73-n9560/arch/i386/kernel/traps.c Mon Jun 30 14:56:26 2003 +@@ -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> +@@ -258,6 +259,7 @@ void die(const char * str, struct pt_reg + handle_BUG(regs); + printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); + show_registers(regs); ++ dump((char *)str, regs); + bust_spinlocks(0); + spin_unlock_irq(&die_lock); + if (in_interrupt()) +--- linux-2.5.73/arch/i386/mm/init.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:06 2003 ++++ linux-2.5.73-n9560/arch/i386/mm/init.c Mon Jun 30 14:56:26 2003 +@@ -189,6 +189,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.5.73/arch/i386/boot/Makefile~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:42 2003 ++++ linux-2.5.73-n9560/arch/i386/boot/Makefile Mon Jun 30 14:56:26 2003 +@@ -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.5.73/arch/i386/Kconfig~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:34 2003 ++++ linux-2.5.73-n9560/arch/i386/Kconfig Mon Jun 30 14:56:26 2003 +@@ -1347,6 +1347,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.5.73/arch/s390/boot/Makefile~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:36 2003 ++++ linux-2.5.73-n9560/arch/s390/boot/Makefile Mon Jun 30 14:56:26 2003 +@@ -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.5.73/arch/s390/boot/install.sh~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:57 2003 ++++ linux-2.5.73-n9560/arch/s390/boot/install.sh Mon Jun 30 14:56:26 2003 +@@ -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.5.73/scripts/mkcompile_h~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:36 2003 ++++ linux-2.5.73-n9560/scripts/mkcompile_h Mon Jun 30 14:56:26 2003 +@@ -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.5.73/kernel/ksyms.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:30 2003 ++++ linux-2.5.73-n9560/kernel/ksyms.c Mon Jun 30 14:56:26 2003 +@@ -59,6 +59,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> +@@ -606,3 +608,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.5.73/kernel/panic.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:18 2003 ++++ linux-2.5.73-n9560/kernel/panic.c Mon Jun 30 14:56:26 2003 +@@ -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.5.73/kernel/sched.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:33:08 2003 ++++ linux-2.5.73-n9560/kernel/sched.c Mon Jun 30 14:56:26 2003 +@@ -40,6 +40,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 ], +@@ -1249,6 +1252,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. +@@ -1336,6 +1348,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.5.73/lib/Kconfig~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:56 2003 ++++ linux-2.5.73-n9560/lib/Kconfig Mon Jun 30 14:56:26 2003 +@@ -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.5.73/mm/page_alloc.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:32 2003 ++++ linux-2.5.73-n9560/mm/page_alloc.c Mon Jun 30 14:56:26 2003 +@@ -84,7 +84,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.5.73/init/Makefile~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:42 2003 ++++ linux-2.5.73-n9560/init/Makefile Mon Jun 30 14:56:26 2003 +@@ -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.5.73/init/main.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:35 2003 ++++ linux-2.5.73-n9560/init/main.c Mon Jun 30 14:56:26 2003 +@@ -101,6 +101,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.5.73/init/version.c~lkcd-kernel-changes-2.5.73 Sun Jun 22 11:32:45 2003 ++++ linux-2.5.73-n9560/init/version.c Mon Jun 30 14:56:26 2003 +@@ -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) +@@ -24,3 +25,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/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 index 0000000000..6b09ba1d9e --- /dev/null +++ b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch @@ -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/lustre-2.5.63.patch b/lustre/kernel_patches/patches/lustre-2.5.63.patch deleted file mode 100644 index 40e6a90995..0000000000 --- a/lustre/kernel_patches/patches/lustre-2.5.63.patch +++ /dev/null @@ -1,862 +0,0 @@ - arch/um/kernel/mem.c | 18 ++++++ - fs/dcache.c | 12 +++- - fs/namei.c | 132 ++++++++++++++++++++++++++++++++++++++----------- - fs/namespace.c | 1 - fs/nfsd/vfs.c | 2 - fs/open.c | 39 ++++++++++++-- - fs/stat.c | 2 - fs/sysfs/inode.c | 2 - include/linux/dcache.h | 28 ++++++++++ - include/linux/fs.h | 20 +++++++ - include/linux/namei.h | 3 - - include/linux/slab.h | 1 - kernel/ksyms.c | 7 ++ - mm/slab.c | 5 + - net/unix/af_unix.c | 2 - 15 files changed, 231 insertions(+), 43 deletions(-) - ---- linux-2.5.63-nointent/arch/um/kernel/mem.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/arch/um/kernel/mem.c Tue Mar 18 15:02:10 2003 -@@ -660,6 +660,22 @@ struct page *pte_mem_map(pte_t pte) - return(phys_mem_map(pte_val(pte))); - } - -+struct page *check_get_page(unsigned long kaddr) -+{ -+ struct page *page; -+ struct mem_region *mr; -+ unsigned long phys = __pa(kaddr); -+ unsigned int n = phys_region_index(phys); -+ -+ if(regions[n] == NULL) -+ return NULL; -+ -+ mr = regions[n]; -+ page = (struct page *) mr->mem_map; -+ return page + ((phys_addr(phys)) >> PAGE_SHIFT); -+} -+ -+ - struct mem_region *page_region(struct page *page, int *index_out) - { - int i; -@@ -747,7 +763,7 @@ extern unsigned long region_pa(void *vir - (addr <= region->start + region->len)) - return(mk_phys(addr - region->start, i)); - } -- panic("region_pa : no region for virtual address"); -+ //panic("region_pa : no region for virtual address"); - return(0); - } - ---- linux-2.5.63-nointent/fs/namei.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/fs/namei.c Mon Mar 24 17:08:18 2003 -@@ -101,6 +101,14 @@ - * any extra contention... - */ - -+void intent_release(struct dentry *de, struct lookup_intent *it) -+{ -+ if (it && de->d_op && de->d_op->d_intent_release) -+ de->d_op->d_intent_release(de, it); -+ -+} -+ -+ - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the - * kernel data space before using them.. -@@ -273,10 +281,18 @@ void path_release(struct nameidata *nd) - * Internal lookup() using the new generic dcache. - * SMP-safe - */ --static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags) -+static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags, struct lookup_intent *it) - { - struct dentry * dentry = d_lookup(parent, name); - -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate2) { -+ if (!dentry->d_op->d_revalidate2(dentry, flags, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ dentry = NULL; -+ } -+ return dentry; -+ } else - if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { - if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) { - dput(dentry); -@@ -330,7 +346,7 @@ ok: - * make sure that nobody added the entry to the dcache in the meantime.. - * SMP-safe - */ --static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags) -+static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags, struct lookup_intent *it) - { - struct dentry * result; - struct inode *dir = parent->d_inode; -@@ -348,7 +364,10 @@ static struct dentry * real_lookup(struc - struct dentry * dentry = d_alloc(parent, name); - result = ERR_PTR(-ENOMEM); - if (dentry) { -- result = dir->i_op->lookup(dir, dentry); -+ if (dir->i_op->lookup2) -+ result = dir->i_op->lookup2(dir, dentry, it); -+ else -+ result = dir->i_op->lookup(dir, dentry); - if (result) - dput(dentry); - else { -@@ -370,6 +389,12 @@ static struct dentry * real_lookup(struc - dput(result); - result = ERR_PTR(-ENOENT); - } -+ } else if (result->d_op && result->d_op->d_revalidate2) { -+ if (!result->d_op->d_revalidate2(result, flags, it) && -+ !d_invalidate(result)) { -+ dput(result); -+ result = ERR_PTR(-ENOENT); -+ } - } - return result; - } -@@ -402,6 +427,7 @@ static inline int do_follow_link(struct - current->link_count--; - return err; - loop: -+ intent_release(dentry, &nd->it); - path_release(nd); - return err; - } -@@ -447,15 +473,26 @@ static int follow_mount(struct vfsmount - return res; - } - --static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry) -+static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry, -+ struct lookup_intent *it) - { - struct vfsmount *mounted; - - spin_lock(&dcache_lock); - mounted = lookup_mnt(*mnt, *dentry); - if (mounted) { -+ int opc = 0, mode = 0; - *mnt = mntget(mounted); - spin_unlock(&dcache_lock); -+ if (it) { -+ opc = it->it_op; -+ mode = it->it_mode; -+ } -+ intent_release(*dentry, it); -+ if (it) { -+ it->it_op = opc; -+ it->it_mode = mode; -+ } - dput(*dentry); - mntput(mounted->mnt_parent); - *dentry = dget(mounted->mnt_root); -@@ -467,7 +504,7 @@ static inline int __follow_down(struct v - - int follow_down(struct vfsmount **mnt, struct dentry **dentry) - { -- return __follow_down(mnt,dentry); -+ return __follow_down(mnt,dentry,NULL); - } - - static inline void follow_dotdot(struct vfsmount **mnt, struct dentry **dentry) -@@ -531,7 +568,7 @@ done: - return 0; - - need_lookup: -- dentry = real_lookup(nd->dentry, name, LOOKUP_CONTINUE); -+ dentry = real_lookup(nd->dentry, name, LOOKUP_CONTINUE, &nd->it); - if (IS_ERR(dentry)) - goto fail; - goto done; -@@ -665,7 +702,7 @@ int link_path_walk(const char * name, st - nd->dentry = next.dentry; - } - err = -ENOTDIR; -- if (!inode->i_op->lookup) -+ if (!inode->i_op->lookup && !inode->i_op->lookup2) - break; - continue; - /* here ends the main loop */ -@@ -716,7 +753,8 @@ last_component: - break; - if (lookup_flags & LOOKUP_DIRECTORY) { - err = -ENOTDIR; -- if (!inode->i_op || !inode->i_op->lookup) -+ if (!inode->i_op || -+ (!inode->i_op->lookup && !inode->i_op->lookup2)) - break; - } - goto return_base; -@@ -735,6 +773,7 @@ out_dput: - dput(next.dentry); - break; - } -+ intent_release(nd->dentry, &nd->it); - path_release(nd); - return_err: - return err; -@@ -857,7 +896,8 @@ int path_lookup(const char *name, unsign - * needs parent already locked. Doesn't follow mounts. - * SMP-safe. - */ --struct dentry * lookup_hash(struct qstr *name, struct dentry * base) -+struct dentry * lookup_hash(struct qstr *name, struct dentry * base, -+ struct lookup_intent *it) - { - struct dentry * dentry; - struct inode *inode; -@@ -880,13 +920,16 @@ struct dentry * lookup_hash(struct qstr - goto out; - } - -- dentry = cached_lookup(base, name, 0); -+ dentry = cached_lookup(base, name, 0, it); - if (!dentry) { - struct dentry *new = d_alloc(base, name); - dentry = ERR_PTR(-ENOMEM); - if (!new) - goto out; -- dentry = inode->i_op->lookup(inode, new); -+ if (inode->i_op->lookup2) -+ dentry = inode->i_op->lookup2(inode, new, it); -+ else -+ dentry = inode->i_op->lookup(inode, new); - if (!dentry) { - dentry = new; - security_inode_post_lookup(inode, dentry); -@@ -898,7 +941,7 @@ out: - } - - /* 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 lookup_intent *it) - { - unsigned long hash; - struct qstr this; -@@ -918,11 +961,16 @@ struct dentry * lookup_one_len(const cha - } - this.hash = end_name_hash(hash); - -- return lookup_hash(&this, base); -+ return lookup_hash(&this, base, it); - 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() - * -@@ -1224,6 +1272,9 @@ int open_namei(const char * pathname, in - /* - * Create - we need to know the parent. - */ -+ nd->it.it_mode = mode; -+ nd->it.it_op |= IT_CREAT; -+ - error = path_lookup(pathname, LOOKUP_PARENT, nd); - if (error) - return error; -@@ -1239,7 +1290,7 @@ int open_namei(const char * pathname, in - - dir = nd->dentry; - down(&dir->d_inode->i_sem); -- dentry = lookup_hash(&nd->last, nd->dentry); -+ dentry = lookup_hash(&nd->last, nd->dentry, &nd->it); - - do_last: - error = PTR_ERR(dentry); -@@ -1247,7 +1298,8 @@ do_last: - up(&dir->d_inode->i_sem); - goto exit; - } -- -+ -+ nd->it.it_mode = mode; - /* Negative dentry, just create the file */ - if (!dentry->d_inode) { - if (!IS_POSIXACL(dir->d_inode)) -@@ -1277,7 +1329,7 @@ do_last: - error = -ELOOP; - if (flag & O_NOFOLLOW) - goto exit_dput; -- while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry)); -+ while (__follow_down(&nd->mnt,&dentry,&nd->it) && d_mountpoint(dentry)); - } - error = -ENOENT; - if (!dentry->d_inode) -@@ -1297,8 +1349,10 @@ ok: - return 0; - - exit_dput: -+ intent_release(dentry, &nd->it); - dput(dentry); - exit: -+ intent_release(nd->dentry, &nd->it); - path_release(nd); - return error; - -@@ -1320,7 +1374,12 @@ do_link: - if (error) - goto exit_dput; - UPDATE_ATIME(dentry->d_inode); -- error = dentry->d_inode->i_op->follow_link(dentry, nd); -+ if (dentry->d_inode->i_op->follow_link2) -+ error = dentry->d_inode->i_op->follow_link2(dentry, nd, &nd->it); -+ else -+ error = dentry->d_inode->i_op->follow_link(dentry, nd); -+ if (error) -+ intent_release(dentry, &nd->it); - dput(dentry); - if (error) - return error; -@@ -1342,7 +1401,7 @@ do_link: - } - dir = nd->dentry; - down(&dir->d_inode->i_sem); -- dentry = lookup_hash(&nd->last, nd->dentry); -+ dentry = lookup_hash(&nd->last, nd->dentry, &nd->it); - putname(nd->last.name); - goto do_last; - } -@@ -1356,7 +1415,7 @@ static struct dentry *lookup_create(stru - dentry = ERR_PTR(-EEXIST); - if (nd->last_type != LAST_NORM) - goto fail; -- dentry = lookup_hash(&nd->last, nd->dentry); -+ dentry = lookup_hash(&nd->last, nd->dentry, &nd->it); - if (IS_ERR(dentry)) - goto fail; - if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode) -@@ -1588,7 +1647,7 @@ asmlinkage long sys_rmdir(const char * p - goto exit1; - } - down(&nd.dentry->d_inode->i_sem); -- dentry = lookup_hash(&nd.last, nd.dentry); -+ dentry = lookup_hash(&nd.last, nd.dentry, &nd.it); - error = PTR_ERR(dentry); - if (!IS_ERR(dentry)) { - error = vfs_rmdir(nd.dentry->d_inode, dentry); -@@ -1654,8 +1713,18 @@ asmlinkage long sys_unlink(const char * - error = -EISDIR; - if (nd.last_type != LAST_NORM) - goto exit1; -+ if (nd.dentry->d_inode->i_op->unlink2) { -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ error = op->unlink2(nd.dentry->d_inode, -+ nd.last.name, -+ nd.last.len); -+ /* the file system wants to use normal vfs path now */ -+ if (error != -EOPNOTSUPP) -+ goto exit1; -+ } - down(&nd.dentry->d_inode->i_sem); -- dentry = lookup_hash(&nd.last, nd.dentry); -+// dentry = lookup_hash(&nd.last, nd.dentry, &nd.it); -+ dentry = lookup_hash(&nd.last, nd.dentry, NULL); - error = PTR_ERR(dentry); - if (!IS_ERR(dentry)) { - /* Why not before? Because we want correct error value */ -@@ -1859,7 +1928,8 @@ exit: - * locking]. - */ - int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry, -- struct inode *new_dir, struct dentry *new_dentry) -+ struct inode *new_dir, struct dentry *new_dentry, -+ struct lookup_intent *it) - { - int error = 0; - struct inode *target; -@@ -1887,6 +1957,7 @@ int vfs_rename_dir(struct inode *old_dir - error = -EBUSY; - else - error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); -+ intent_release(new_dentry, it); - if (target) { - if (!error) - target->i_flags |= S_DEAD; -@@ -1904,7 +1975,8 @@ int vfs_rename_dir(struct inode *old_dir - } - - int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry, -- struct inode *new_dir, struct dentry *new_dentry) -+ struct inode *new_dir, struct dentry *new_dentry, -+ struct lookup_intent *it) - { - struct inode *target; - int error; -@@ -1921,6 +1993,7 @@ int vfs_rename_other(struct inode *old_d - error = -EBUSY; - else - error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); -+ intent_release(new_dentry, it); - if (!error) { - /* The following d_move() should become unconditional */ - if (!(old_dir->i_sb->s_type->fs_flags & FS_ODD_RENAME)) -@@ -1934,7 +2007,8 @@ int vfs_rename_other(struct inode *old_d - } - - int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, -- struct inode *new_dir, struct dentry *new_dentry) -+ struct inode *new_dir, struct dentry *new_dentry, -+ struct lookup_intent *it) - { - int error; - int is_dir = S_ISDIR(old_dentry->d_inode->i_mode); -@@ -1960,9 +2034,9 @@ int vfs_rename(struct inode *old_dir, st - DQUOT_INIT(new_dir); - - if (is_dir) -- error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry); -+ error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry, it); - else -- error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry); -+ error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry, it); - if (!error) { - if (old_dir == new_dir) - inode_dir_notify(old_dir, DN_RENAME); -@@ -2005,7 +2079,7 @@ static inline int do_rename(const char * - - trap = lock_rename(new_dir, old_dir); - -- old_dentry = lookup_hash(&oldnd.last, old_dir); -+ old_dentry = lookup_hash(&oldnd.last, old_dir, &oldnd.it); - error = PTR_ERR(old_dentry); - if (IS_ERR(old_dentry)) - goto exit3; -@@ -2025,7 +2099,7 @@ static inline int do_rename(const char * - error = -EINVAL; - if (old_dentry == trap) - goto exit4; -- new_dentry = lookup_hash(&newnd.last, new_dir); -+ new_dentry = lookup_hash(&newnd.last, new_dir, &newnd.it); - error = PTR_ERR(new_dentry); - if (IS_ERR(new_dentry)) - goto exit4; -@@ -2035,7 +2109,7 @@ static inline int do_rename(const char * - goto exit5; - - error = vfs_rename(old_dir->d_inode, old_dentry, -- new_dir->d_inode, new_dentry); -+ new_dir->d_inode, new_dentry, NULL); - exit5: - dput(new_dentry); - exit4: ---- linux-2.5.63-nointent/fs/nfsd/vfs.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/fs/nfsd/vfs.c Tue Mar 18 15:02:10 2003 -@@ -1337,7 +1337,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ err = vfs_rename(fdir, odentry, tdir, ndentry, NULL); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); ---- linux-2.5.63-nointent/fs/sysfs/inode.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/fs/sysfs/inode.c Tue Mar 18 15:02:10 2003 -@@ -540,7 +540,7 @@ static struct dentry * 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); - } - - ---- linux-2.5.63-nointent/include/linux/dcache.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/include/linux/dcache.h Tue Mar 18 15:02:10 2003 -@@ -12,6 +12,27 @@ - - struct vfsmount; - -+#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) -+ -+ -+struct lookup_intent { -+ int it_op; -+ 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; -+}; -+ -+ - /* - * linux/include/linux/dcache.h - * -@@ -34,6 +55,8 @@ struct qstr { - char name_str[0]; - }; - -+#include <linux/namei.h> -+ - struct dentry_stat_t { - int nr_dentry; - int nr_unused; -@@ -87,6 +110,7 @@ struct dentry { - struct list_head d_subdirs; /* our children */ - struct list_head d_alias; /* inode alias list */ - int d_mounted; -+ struct lookup_intent *d_it; - struct qstr d_name; - struct qstr * d_qstr; /* quick str ptr used in lockless lookup and concurrent d_move */ - unsigned long d_time; /* used by d_revalidate */ -@@ -107,6 +131,8 @@ struct dentry_operations { - int (*d_delete)(struct dentry *); - void (*d_release)(struct dentry *); - void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate2)(struct dentry *, int, struct lookup_intent *); -+ void (*d_intent_release)(struct dentry *, struct lookup_intent *); - }; - - /* the dentry parameter passed to d_hash and d_compare is the parent -@@ -147,6 +173,8 @@ d_iput: no no yes - - #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ - #define DCACHE_UNHASHED 0x0010 -+#define DCACHE_LUSTRE_INVALID 0x0011 /* Lustre invalidated */ -+ - - extern spinlock_t dcache_lock; - extern rwlock_t dparent_lock; ---- linux-2.5.63-nointent/include/linux/fs.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/include/linux/fs.h Tue Mar 18 15:02:10 2003 -@@ -234,6 +234,9 @@ 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 -@@ -642,7 +645,7 @@ extern int vfs_symlink(struct inode *, s - extern int vfs_link(struct dentry *, struct inode *, struct dentry *); - extern int vfs_rmdir(struct inode *, struct dentry *); - extern int vfs_unlink(struct inode *, struct dentry *); --extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); -+extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct lookup_intent *it); - - /* - * File types -@@ -728,19 +731,33 @@ struct file_operations { - struct inode_operations { - int (*create) (struct inode *,struct dentry *,int); - struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup2) (struct inode *,struct dentry *, -+ struct lookup_intent *); - int (*link) (struct dentry *,struct inode *,struct dentry *); -+ int (*link2) (struct inode *,struct inode *, const char *, int); - int (*unlink) (struct inode *,struct dentry *); -+ int (*unlink2) (struct inode *, const char *, int); - int (*symlink) (struct inode *,struct dentry *,const char *); -+ int (*symlink2) (struct inode *, const char *, int, const char *); - int (*mkdir) (struct inode *,struct dentry *,int); -+ int (*mkdir2) (struct inode *, const char *, int,int); - int (*rmdir) (struct inode *,struct dentry *); -+ int (*rmdir2) (struct inode *, const char *, int); - int (*mknod) (struct inode *,struct dentry *,int,dev_t); -+ int (*mknod2) (struct inode *, const char *, int,int,int); - int (*rename) (struct inode *, struct dentry *, - struct inode *, struct dentry *); -+ int (*rename2) (struct inode *, struct inode *, -+ const char *oldname, int oldlen, -+ const char *newname, int newlen); - int (*readlink) (struct dentry *, char *,int); - int (*follow_link) (struct dentry *, struct nameidata *); -+ int (*follow_link2) (struct dentry *, struct nameidata *, -+ struct lookup_intent *it); - void (*truncate) (struct inode *); - int (*permission) (struct inode *, int); - int (*setattr) (struct dentry *, struct iattr *); -+ int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); - int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t,int); -@@ -953,6 +970,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, char *name, void *data); - extern long do_mount(char *, char *, char *, unsigned long, void *); - - extern int vfs_statfs(struct super_block *, struct statfs *); ---- linux-2.5.63-nointent/include/linux/namei.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/include/linux/namei.h Tue Mar 18 15:02:10 2003 -@@ -11,6 +11,7 @@ struct nameidata { - struct qstr last; - unsigned int flags; - int last_type; -+ struct lookup_intent it; - }; - - /* -@@ -44,7 +45,7 @@ extern int FASTCALL(link_path_walk(const - extern void path_release(struct nameidata *); - - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); --extern struct dentry * lookup_hash(struct qstr *, struct dentry *); -+extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct lookup_intent *); - - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); ---- linux-2.5.63-nointent/include/linux/slab.h~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/include/linux/slab.h Tue Mar 18 15:02:10 2003 -@@ -55,6 +55,7 @@ extern int kmem_cache_destroy(kmem_cache - extern int kmem_cache_shrink(kmem_cache_t *); - extern void *kmem_cache_alloc(kmem_cache_t *, int); - extern void kmem_cache_free(kmem_cache_t *, void *); -+extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp); - extern unsigned int kmem_cache_size(kmem_cache_t *); - - extern void *kmalloc(size_t, int); ---- linux-2.5.63-nointent/kernel/ksyms.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/kernel/ksyms.c Tue Mar 18 15:02:10 2003 -@@ -377,6 +377,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); -@@ -407,6 +408,12 @@ EXPORT_SYMBOL(request_irq); - EXPORT_SYMBOL(free_irq); - EXPORT_SYMBOL(irq_stat); - -+/* 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); ---- linux-2.5.63-nointent/mm/slab.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/mm/slab.c Tue Mar 18 15:02:10 2003 -@@ -1792,6 +1792,11 @@ static inline void __cache_free (kmem_ca - } - } - -+int kmem_cache_validate(kmem_cache_t *cachep, void *objp) -+{ -+ return 1; -+} -+ - /** - * kmem_cache_alloc - Allocate an object - * @cachep: The cache to allocate from. ---- linux-2.5.63-nointent/net/unix/af_unix.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/net/unix/af_unix.c Tue Mar 18 15:02:10 2003 -@@ -720,7 +720,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.5.63-nointent/fs/dcache.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/fs/dcache.c Tue Mar 18 15:02:10 2003 -@@ -1111,15 +1111,21 @@ void d_delete(struct dentry * dentry) - * Adds a dentry to the hash according to its name. - */ - --void d_rehash(struct dentry * entry) -+void __d_rehash(struct dentry * entry, int lock) - { - struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash); -- spin_lock(&dcache_lock); -+ if (lock) spin_lock(&dcache_lock); - if (!list_empty(&entry->d_hash) && !d_unhashed(entry)) BUG(); - entry->d_vfs_flags &= ~DCACHE_UNHASHED; - entry->d_bucket = list; - list_add_rcu(&entry->d_hash, list); -- spin_unlock(&dcache_lock); -+ if (lock) spin_unlock(&dcache_lock); -+} -+EXPORT_SYMBOL(__d_rehash); -+ -+void d_rehash(struct dentry * entry) -+{ -+ __d_rehash(entry, 1); - } - - #define do_switch(x,y) do { \ ---- linux-2.5.63-nointent/fs/namespace.c~lustre-2.5.63 Tue Mar 18 15:02:10 2003 -+++ linux-2.5.63-nointent-root/fs/namespace.c Tue Mar 18 15:02:10 2003 -@@ -925,6 +925,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.5.63-nointent/fs/open.c~lustre-2.5.63 Thu Mar 20 12:43:39 2003 -+++ linux-2.5.63-nointent-root/fs/open.c Mon Mar 24 16:25:47 2003 -@@ -97,7 +97,8 @@ static inline long do_sys_truncate(const - struct nameidata nd; - struct inode * inode; - int error; -- -+ struct lookup_intent it = { .it_op = IT_GETATTR }; -+ nd.it=it; - error = -EINVAL; - if (length < 0) /* sorry, but loff_t says... */ - goto out; -@@ -142,11 +143,13 @@ static inline long do_sys_truncate(const - error = locks_verify_truncate(inode, NULL, length); - if (!error) { - DQUOT_INIT(inode); -+ intent_release(nd.dentry, &nd.it); - error = do_truncate(nd.dentry, length); - } - put_write_access(inode); - - dput_and_out: -+ intent_release(nd.dentry, &nd.it); - path_release(&nd); - out: - return error; -@@ -340,6 +343,8 @@ asmlinkage long sys_access(const char * - int old_fsuid, old_fsgid; - kernel_cap_t old_cap; - int res; -+ struct lookup_intent it = { .it_op = IT_GETATTR }; -+ nd.it=it; - - if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ - return -EINVAL; -@@ -371,6 +376,8 @@ 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; -+ -+ intent_release(nd.dentry, &nd.it); - path_release(&nd); - } - -@@ -385,6 +392,8 @@ asmlinkage long sys_chdir(const char * f - { - struct nameidata nd; - int error; -+ struct lookup_intent it = { .it_op = IT_GETATTR }; -+ nd.it=it; - - error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd); - if (error) -@@ -397,6 +406,7 @@ asmlinkage long sys_chdir(const char * f - set_fs_pwd(current->fs, nd.mnt, nd.dentry); - - dput_and_out: -+ intent_release(nd.dentry, &nd.it); - path_release(&nd); - out: - return error; -@@ -436,6 +446,8 @@ asmlinkage long sys_chroot(const char * - { - struct nameidata nd; - int error; -+ struct lookup_intent it = { .it_op = IT_GETATTR }; -+ nd.it=it; - - error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd); - if (error) -@@ -508,6 +520,18 @@ asmlinkage long sys_chmod(const char * f - error = -EROFS; - if (IS_RDONLY(inode)) - goto dput_and_out; -+ -+ if (inode->i_op->setattr_raw) { -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ -+ newattrs.ia_mode = mode; -+ newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; -+ newattrs.ia_valid |= ATTR_RAW; -+ error = op->setattr_raw(inode, &newattrs); -+ /* the file system wants to use normal vfs path now */ -+ if (error != -EOPNOTSUPP) -+ goto dput_and_out; -+ } - - error = -EPERM; - if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -@@ -619,7 +643,10 @@ asmlinkage long sys_fchown(unsigned int - struct file *filp_open(const char * filename, int flags, int mode) - { - int namei_flags, error; -+ struct file * temp_filp; - struct nameidata nd; -+ struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = flags }; -+ nd.it=it; - - namei_flags = flags; - if ((namei_flags+1) & O_ACCMODE) -@@ -628,9 +655,11 @@ struct file *filp_open(const char * file - namei_flags |= 2; - - error = open_namei(filename, namei_flags, mode, &nd); -- if (!error) -- return dentry_open(nd.dentry, nd.mnt, flags); -- -+ if (!error) { -+ temp_filp = dentry_open(nd.dentry, nd.mnt, flags); -+ intent_release(nd.dentry,&nd.it); -+ return temp_filp; -+ } - return ERR_PTR(error); - } - -@@ -675,7 +704,7 @@ struct file *dentry_open(struct dentry * - goto cleanup_all; - } - } -- -+ - return f; - - cleanup_all: ---- linux-2.5.63-nointent/fs/stat.c~lustre-2.5.63 Fri Mar 21 21:15:40 2003 -+++ linux-2.5.63-nointent-root/fs/stat.c Fri Mar 21 21:16:53 2003 -@@ -65,6 +65,7 @@ int vfs_stat(char *name, struct kstat *s - error = user_path_walk(name, &nd); - if (!error) { - error = vfs_getattr(nd.mnt, nd.dentry, stat); -+ intent_release(nd.dentry, &nd.it); - path_release(&nd); - } - return error; -@@ -80,6 +81,7 @@ int vfs_lstat(char *name, struct kstat * - error = user_path_walk_link(name, &nd); - if (!error) { - error = vfs_getattr(nd.mnt, nd.dentry, stat); -+ intent_release(nd.dentry, &nd.it); - path_release(&nd); - } - return error; - -_ diff --git a/lustre/kernel_patches/patches/lustre_build.patch b/lustre/kernel_patches/patches/lustre_build.patch new file mode 100644 index 0000000000..70f6a37d4b --- /dev/null +++ b/lustre/kernel_patches/patches/lustre_build.patch @@ -0,0 +1,33 @@ + fs/Kconfig | 8 ++++++++ + fs/Makefile | 1 + + 2 files changed, 9 insertions(+) + +--- linux-2.5.72/fs/Makefile~lustre_build 2003-06-16 22:20:05.000000000 -0600 ++++ linux-2.5.72-braam/fs/Makefile 2003-06-22 10:11:57.000000000 -0600 +@@ -57,6 +57,7 @@ obj-$(CONFIG_RAMFS) += ramfs/ + obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ + obj-$(CONFIG_CODA_FS) += coda/ + obj-$(CONFIG_INTERMEZZO_FS) += intermezzo/ ++obj-$(CONFIG_LUSTRE_FS) += lustre/ + obj-$(CONFIG_MINIX_FS) += minix/ + obj-$(CONFIG_FAT_FS) += fat/ + obj-$(CONFIG_UMSDOS_FS) += umsdos/ +--- linux-2.5.72/fs/Kconfig~lustre_build 2003-06-16 22:20:05.000000000 -0600 ++++ linux-2.5.72-braam/fs/Kconfig 2003-06-22 10:47:15.000000000 -0600 +@@ -1561,6 +1561,14 @@ config CODA_FS + whenever you want), say M here and read + <file:Documentation/modules.txt>. The module will be called coda. + ++config LUSTRE_FS ++ bool "Lustre: next generation clustering file system (EXPERIMENTAL)" ++ depends on INET && EXPERIMENTAL ++ help ++ Lustre is a next generation storage architecture which includes a ++ POSIX compliant cluster file system. For details see ++ <http://www.lustre.org/>. ++ + config INTERMEZZO_FS + tristate "InterMezzo file system support (replicating fs) (EXPERIMENTAL)" + depends on INET && EXPERIMENTAL + +_ diff --git a/lustre/kernel_patches/patches/netconsole_sysrq.patch b/lustre/kernel_patches/patches/netconsole_sysrq.patch deleted file mode 100644 index b9954614c2..0000000000 --- a/lustre/kernel_patches/patches/netconsole_sysrq.patch +++ /dev/null @@ -1,41 +0,0 @@ - 0 files changed - ---- linux-2.4.20-rh/drivers/net/netconsole.c~netconsole_sysrq 2003-04-11 14:04:57.000000000 +0800 -+++ linux-2.4.20-rh-root/drivers/net/netconsole.c 2003-07-01 11:10:26.000000000 +0800 -@@ -988,7 +988,15 @@ static void netconsole_netdump (struct p - reply.info = 0; - send_netdump_skb(dev, tmp, strlen(tmp), &reply); - break; -- -+ case COMM_SYSRQ: -+ Dprintk("got SYSRQ command.\n"); -+ printk("netdump: got SYSRQ command %d \n", req->from); -+ handle_sysrq(req->from, regs, NULL, NULL); -+ reply.code = REPLY_SYSRQ; -+ reply.nr = req->nr; -+ reply.info = req->from; -+ send_netdump_skb(dev, tmp, strlen(tmp), &reply); -+ break; - default: - reply.code = REPLY_ERROR; - reply.nr = req->nr; ---- linux-2.4.20-rh/drivers/net/netconsole.h~netconsole_sysrq 2003-04-11 14:04:57.000000000 +0800 -+++ linux-2.4.20-rh-root/drivers/net/netconsole.h 2003-07-01 11:11:29.000000000 +0800 -@@ -42,6 +42,7 @@ enum netdump_commands { - COMM_START_NETDUMP_ACK = 7, - COMM_GET_REGS = 8, - COMM_SHOW_STATE = 9, -+ COMM_SYSRQ=10, - }; - - #define NETDUMP_REQ_SIZE (8+4*4) -@@ -69,6 +70,7 @@ enum netdump_replies { - REPLY_REGS = 10, - REPLY_MAGIC = 11, - REPLY_SHOW_STATE = 12, -+ REPLY_SYSRQ=13, - }; - - typedef struct netdump_reply_s { - -_ diff --git a/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch b/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch new file mode 100644 index 0000000000..88726a3175 --- /dev/null +++ b/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch @@ -0,0 +1,58389 @@ + drivers/scsi/Kconfig | 2 + drivers/scsi/Makefile | 1 + drivers/scsi/qla2xxx/Kconfig | 37 + drivers/scsi/qla2xxx/Makefile | 56 + drivers/scsi/qla2xxx/README.qla2x00 | 744 ++++ + drivers/scsi/qla2xxx/exioct.h | 947 +++++ + drivers/scsi/qla2xxx/exioctln.h | 255 + + drivers/scsi/qla2xxx/inioct.h | 129 + drivers/scsi/qla2xxx/ql2100tp_fw.c | 4866 ++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/ql2200ip_fw.c | 5884 ++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/ql2300tpx_fw.c | 6494 +++++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_cfg.c | 2780 +++++++++++++++ + drivers/scsi/qla2xxx/qla_cfg.h | 181 + drivers/scsi/qla2xxx/qla_cfgln.c | 726 +++ + drivers/scsi/qla2xxx/qla_dbg.c | 1000 +++++ + drivers/scsi/qla2xxx/qla_dbg.h | 138 + drivers/scsi/qla2xxx/qla_def.h | 2484 +++++++++++++ + drivers/scsi/qla2xxx/qla_fo.c | 1681 +++++++++ + drivers/scsi/qla2xxx/qla_fo.cfg | 31 + drivers/scsi/qla2xxx/qla_fo.h | 75 + drivers/scsi/qla2xxx/qla_gbl.h | 395 ++ + drivers/scsi/qla2xxx/qla_inioct.c | 495 ++ + drivers/scsi/qla2xxx/qla_init.c | 5945 ++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_inline.h | 375 ++ + drivers/scsi/qla2xxx/qla_iocb.c | 1276 ++++++ + drivers/scsi/qla2xxx/qla_ip.c | 1769 +++++++++ + drivers/scsi/qla2xxx/qla_ip.h | 420 ++ + drivers/scsi/qla2xxx/qla_isr.c | 1474 ++++++++ + drivers/scsi/qla2xxx/qla_listops.h | 397 ++ + drivers/scsi/qla2xxx/qla_mbx.c | 2884 +++++++++++++++ + drivers/scsi/qla2xxx/qla_os.c | 5879 ++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_os.h | 156 + drivers/scsi/qla2xxx/qla_settings.h | 80 + drivers/scsi/qla2xxx/qla_sup.c | 560 +++ + drivers/scsi/qla2xxx/qla_vendor.c | 193 + + drivers/scsi/qla2xxx/qla_version.h | 31 + drivers/scsi/qla2xxx/qla_xioct.c | 6589 ++++++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qlfo.h | 413 ++ + drivers/scsi/qla2xxx/qlfolimits.h | 92 + drivers/scsi/qla2xxx/qlfoln.h | 76 + drivers/scsi/qla2xxx/release.txt | 22 + drivers/scsi/qla2xxx/revision.notes | 167 + 42 files changed, 58199 insertions(+) + +--- linux-2.5.73/drivers/scsi/Makefile~qla2xxx-v8.00.00b1-2.5.73 Sun Jun 22 11:33:08 2003 ++++ linux-2.5.73-n9560/drivers/scsi/Makefile Thu Jul 3 15:34:28 2003 +@@ -73,6 +73,7 @@ obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicf + obj-$(CONFIG_SCSI_QLOGIC_ISP) += qlogicisp.o + obj-$(CONFIG_SCSI_QLOGIC_FC) += qlogicfc.o + obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o ++obj-$(CONFIG_SCSI_QLA2XXX) += qla2xxx/ + obj-$(CONFIG_SCSI_PAS16) += pas16.o + obj-$(CONFIG_SCSI_SEAGATE) += seagate.o + obj-$(CONFIG_SCSI_FD_8xx) += seagate.o +--- linux-2.5.73/drivers/scsi/Kconfig~qla2xxx-v8.00.00b1-2.5.73 Sun Jun 22 11:33:16 2003 ++++ linux-2.5.73-n9560/drivers/scsi/Kconfig Thu Jul 3 15:34:28 2003 +@@ -1283,6 +1283,8 @@ config SCSI_QLOGIC_1280 + The module will be called qla1280. If you want to compile it as + a module, say M here and read <file:Documentation/modules.txt>. + ++source "drivers/scsi/qla2xxx/Kconfig" ++ + config SCSI_QLOGICPTI + tristate "PTI Qlogic, ISP Driver" + depends on SBUS && SCSI +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/Kconfig Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,37 @@ ++config SCSI_QLA2XXX ++ bool "QLogic QLA2XXX FC-SCSI support (v8)" ++ ---help--- ++ help here... ++ ++config SCSI_QLA2XXX_QLA21XX ++ tristate "QLogic QLA21xx FC-SCSI support (v8)" ++ depends on SCSI_QLA2XXX ++ ---help--- ++ help here... ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read <file:Documentation/modules.txt>. The module ++ will be called qla2100. ++ ++config SCSI_QLA2XXX_QLA22XX ++ tristate "QLogic QLA22xx FC-SCSI support (v8)" ++ depends on SCSI_QLA2XXX ++ ---help--- ++ help here... ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read <file:Documentation/modules.txt>. The module ++ will be called qla2200. ++ ++config SCSI_QLA2XXX_QLA23XX ++ tristate "QLogic QLA23xx FC-SCSI support (v8)" ++ depends on SCSI_QLA2XXX ++ ---help--- ++ help here... ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read <file:Documentation/modules.txt>. The module ++ will be called qla2300. +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/Makefile Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,56 @@ ++# Kernel makefile for 8.x series QLogic Fibre Channel driver. ++# ++EXTRA_CFLAGS += -Idrivers/scsi -I$(obj) -DUNIQUE_FW_NAME ++ ++ISPTYPES := qla2100 qla2200 qla2300 ++ISPDIRS := $(foreach dir, $(ISPTYPES), $(addsuffix /, $(addprefix .,$(dir)))) ++ ++ISP2100_FW := ql2100tp_fw.o ++ISP2200_FW := ql2200ip_fw.o ++ISP2300_FW := ql2300tpx_fw.o #ql2322tpx_fw.o ++ ++COMMON_SRCS := qla_os.c qla_init.c qla_mbx.c qla_iocb.c qla_isr.c qla_xioct.c qla_inioct.c \ ++ qla_dbg.c qla_sup.c qla_fo.c qla_cfg.c qla_cfgln.c qla_vendor.c ++COMMON_OBJS := $(foreach file, $(COMMON_SRCS), $(patsubst %.c, %.o, $(file))) ++ ++ISP2100_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2100/,$(file))) ++ISP2100_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2100/,$(file))) ++ISP2200_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2200/,$(file))) ++ISP2200_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2200/,$(file))) ++ISP2300_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2300/,$(file))) ++ISP2300_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2300/,$(file))) ++ ++PREPALL := $(shell for dir in $(ISPDIRS) ; \ ++ do \ ++ if [ ! -d $(obj)/$${dir} ] ; then \ ++ mkdir $(obj)/$${dir} ; \ ++ fi ; \ ++ for link in $(foreach file, $(COMMON_OBJS), $(patsubst %.o, %.c, $(file))) ; \ ++ do \ ++ if [ ! -h $(obj)/$${dir}$${link} ] ; then \ ++ ln -sf ../$${link} $(obj)/$${dir}$${link} ; \ ++ fi ; \ ++ done \ ++ done) ++ ++obj-$(CONFIG_SCSI_QLA2XXX_QLA21XX) += qla2100.o ++obj-$(CONFIG_SCSI_QLA2XXX_QLA22XX) += qla2200.o ++obj-$(CONFIG_SCSI_QLA2XXX_QLA23XX) += qla2300.o ++ ++$(obj)/qla2100.o: $(PREPALL) ++$(obj)/qla2100.o: ISPTYPE := qla21xx ++$(obj)/qla2100.o: EXTRA_CFLAGS += -D$(ISPTYPE) ++ ++$(obj)/qla2200.o: $(PREPALL) ++$(obj)/qla2200.o: ISPTYPE := qla22xx ++$(obj)/qla2200.o: EXTRA_CFLAGS += -D$(ISPTYPE) ++ ++$(obj)/qla2300.o: $(PREPALL) ++$(obj)/qla2300.o: ISPTYPE := qla23xx ++$(obj)/qla2300.o: EXTRA_CFLAGS += -D$(ISPTYPE) -DTPX -DEXTENDED_IDS ++ ++qla2100-objs := $(ISP2100_DIR_OBJS) $(ISP2100_FW) ++qla2200-objs := $(ISP2200_DIR_OBJS) $(ISP2200_FW) ++qla2300-objs := $(ISP2300_DIR_OBJS) $(ISP2300_FW) ++ ++clean-files := $(ISP2100_DIR_SRCS) $(ISP2200_DIR_SRCS) $(ISP2300_DIR_SRCS) +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/README.qla2x00 Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,744 @@ ++ QLogic Fibre Channel Driver ++ for Red Hat Linux 7.2, 7.3, and Advanced Server 2.1 ++ and Suse Linux 7.3, and Enterprise 7 ++ ++Products supported: QLA22XX, QLA23XX ++ ++09/10/2002 ++ ++Contents ++-------- ++ ++1. OS Support ++ ++2. Supported Features ++ ++3. Release History ++ ++4. Saving the Driver Source to Diskette ++ ++5. Installing the Driver ++ ++ 5.1 Building the driver from the Source ++ 5.1.1. Building a Uni-Processor (UP) version of the driver ++ 5.1.2. Building a Symmetric Multi-Processor(SMP) version of the ++ Driver ++ 5.2 Load the Driver Manually using INSMOD or MODPROBE ++ 5.3 Making a RAMDISK Image to Load the Driver ++ ++6. Driver Parameters ++ ++ 6.1 System Parameters ++ 6.1.1 Multiple LUN Support ++ 6.2 NVRAM Parameters ++ 6.3 Driver Command Line Parameters ++ ++7. Limitations ++ ++8. Additional Notes ++ ++ 8.1 Proc Filesystem Support ++ 8.2 Co-existence of QLogic 4.x and 6.x Linux Drivers ++ 8.3 Failover Support ++ 8.3.1 How to enable the Failover support in the Driver ++ 8.3.2 Using SANsurfer with QLA2XXX Driver the First Time ++ 8.3.3 Configuration Changes Made via SANsurfer ++ 8.4 Persistent Binding ++ ++9. Diskette Content ++ ++10. Contacting QLogic ++ ++ ++********************************************************************** ++ ++ ++1. OS Support ++------------- ++ ++This driver works with Red Hat Linux 7.2, 7.3, and Advanced Server ++2.1 and Suse Linux 7.3 and Enterprise 7. Earlier or later versions ++of Linux may be supported but were not tested at the time of this ++release. Refer to the SUPPORTED_KERNEL_VERSION.txt file for a list ++of kernel versions tested with this release. ++ ++ ++********************************************************************** ++ ++ ++2. Supported Features ++--------------------- ++ ++* FCAL - direct attach loop ++* Point-to-point ++* Fabric support ++* Initiator mode only ++* Fault recovery on down loops ++* Persistent binding ++* Extended LUN support up to 255 LUNs ++* FC tape support ++* IPFC support ++* Non Failover and Failover capability ++ ++ ++********************************************************************** ++ ++ ++3. Release History ++------------------ ++ ++Please refer to Release Notes (release.txt). ++ ++ ++********************************************************************** ++ ++ ++4. Saving the Driver Source to Diskette ++--------------------------------------- ++ ++1. Download the failover or non-failover qla2x00src-vx.yy-*.tgz file ++ from QLogic's website. ++ ++ * Failover compressed file has suffix "fo" while non failover ++ does not. ++ ++2. If prompted "What would you like to do with this file?" choose ++ "Save this file to disk." ++3. Insert a blank diskette and download to the diskette directly. ++ ++ ++********************************************************************** ++ ++ ++5. Installing the Driver ++------------------------ ++ ++NOTE: Refer to the file BUILD_KERNEL.txt for instructions on how ++ to build a custom kernel with the QLogic Driver embedded. ++ ++5.1 Building a Driver from the Source Code ++------------------------------------------- ++ ++From the source code, you can build a qla2200.o or qla2300.o for ++your UP or SMP system, and load the driver manually or automatically ++using a RAMDISK image during system boot time. ++ ++ ++5.1.1 Building a Uni-Processor (UP) Version of the Driver ++--------------------------------------------------------- ++ ++1. Extract the kernel-headers and kernel-sources RPM files from the ++ first RedHat CD: ++ ++ # cd /mnt/cdrom/RedHat/RPMS ++ # rpm -iv kernel-headers*.rpm (not required for Red Hat 7.3) ++ # rpm -iv kernel-source*.rpm ++ ++2. Using the diskette you created in Section 4, copy the ++ qla2x00src-vx.yy-*.tgz file to /qla2x00. Follow these steps from ++ the "/" (root) directory: ++ ++ # mkdir qla2x00 ++ # cd qla2x00 ++ # mount /mnt/floppy ++ # cp /mnt/floppy/*.tgz . (the period at the end is required) ++ # tar -xvzf *.tgz ++ # cd qlogic ++ # ./drvsetup (this will extract the source files in to the ++ current directory) ++ ++3. Build the Driver qla2200.o and qla2300.o from the source code by ++ typing: ++ ++ # make all ++ ++ For SuSE Distribution: ++ ++ # make all OSVER=linux ++ ++4. To load the driver manually, see section 5.2. To make a RAMDISK ++ image to load the driver during system boot time, see section 5.3. ++ ++ ++5.1.2. Building a Symmetric Multi-Processor (SMP) Version of the Driver ++----------------------------------------------------------------------- ++ ++1. Extract the kernel-headers and kernel-source RPM files from the ++ first RedHat CD: ++ ++ # cd /mnt/cdrom/RedHat/RPMS ++ # rpm -iv kernel-headers*.rpm (not required for Red Hat 7.3) ++ # rpm -iv kernel-source*.rpm ++ ++2. Using the diskette you created in Section 4, copy the ++ qla2x00src-vx.yy-*.tgz file to /qla2x00. Follow these steps from ++ the "/" (root) directory: ++ ++ # mkdir qla2x00 ++ # cd qla2x00 ++ # mount /mnt/floppy ++ # cp /mnt/floppy/*.tgz . (the period at the end is required) ++ # tar -xvzf *.tgz ++ # cd qlogic ++ # ./drvsetup (this will extract the source files in to the ++ current directory) ++ ++3. Build the Driver qla2200.o and qla2300.o from the source code by ++ typing: ++ ++ # make all SMP=1 ++ ++ For SuSE Distribution: ++ ++ # make all SMP=1 OSVER=linux ++ ++4. To load the driver manually, see section 5.2. To make a RAMDISK ++ image to load the driver during system boot time, see section 5.3. ++ ++ ++5.2 Load the Driver Manually using INSMOD or MODPROBE ++------------------------------------------------------ ++ ++Before loading the driver manually, first build the driver binary from ++the driver source files as described in sections 5.1.1 and 5.1.2. ++ ++- To load the driver directly from the local build directory, type ++ the following: ++ ++ # insmod qla2200.o ++ or ++ # insmod qla2300.o ++ ++- To load the driver using modprobe: ++ ++ 1. Build the driver qla2200.o and qla2300.o from the source ++ code by typing: ++ ++ # make all install ++ ++ For SuSE Distribution: ++ ++ # make all OSVER=linux install ++ ++ 2. To ensure that the older driver binary included in the ++ original distribution does not interfere with the updated ++ version, please rename the old driver binary as follows: ++ ++ # cd /lib/modules/<kernel_version>/kernel/drivers/addon/qla2200 ++ # mv qla2200.o qla2200_rh.o ++ # mv qla2300.o qla2300_rh.o ++ ++ 3. Type the following to load the Driver: ++ ++ # modprobe qla2200 ++ or ++ # modprobe qla2300 ++ ++ ++5.3 Making a RAMDISK Image to Load the Driver ++---------------------------------------------- ++ ++1. Build the Driver binary files (see 5.1.1 and 5.1.2). ++ ++2. Copy the files to: ++ ++ /lib/modules/<kernel version>/kernel/drivers/scsi/ ++ ++ ++NOTE: To ensure that the older Driver binary included in the original ++ distribution does not interfere with the updated version, ++ please rename the old Driver binary as follows: ++ ++ # cd /lib/modules/<kernel_version>/kernel/drivers/addon/qla2200 ++ # mv qla2200.o qla2200_rh.o ++ # mv qla2300.o qla2300_rh.o ++ ++3. Add the following line to /etc/modules.conf. ++ ++ alias scsi_hostadapter0 qla2200 ++ or ++ alias scsi_hostadapter0 qla2300 ++ ++NOTE: Must add one entry for each HBA in the system. For example, ++ If two QLA2200 hbas are installed add the following: ++ ++ alias scsi_hostadapter0 qla2200 ++ alias scsi_hostadapter1 qla2200 ++ ++4. Type the following command: ++ ++ # mkinitrd -f <ramdisk image file name> <kernel version> ++ ++NOTE: This step will overwrite the original ramdisk image file if ++ executed within the /boot directory. Specify a unique ramdisk ++ image name to preserve the original ramdisk image. ++ ++ - Copy the file to /boot. ++ ++ For SuSE Distribution: ++ ++ - Type the following command: ++ ++ # /sbin/mk_initrd ++ ++ NOTE: By default, the RAMDISK images created are: ++ ++ /boot/initrd ++ /boot/initrd.suse ++ ++5. Configure the boot loader with the new RAMDISK image. ++ ++ For LILO: ++ ++ Add "initrd=/boot/<ramdisk file name>" in ++ /etc/lilo.conf under one of the kernel entries ++ to use the RAMDISK image. ++ ++ Run "lilo" and reboot system. Select the kernel ++ with the new RAMDISK image to come up. ++ ++ For GRUB: ++ ++ Add "initrd=/boot/<RAMDISK file name>" in ++ /etc/grub.conf under one of the kernel entries ++ to use the RAMDISK image. ++ ++********************************************************************** ++ ++ ++6. Driver Parameters ++-------------------- ++ ++The Driver parameters are divided into System Parameters and NVRAM ++Parameters sections. ++ ++ ++6.1 System Parameters ++---------------------- ++ ++6.1.1 Multiple LUN Support ++-------------------------- ++ ++Support for multiple LUNs can be configured in one of three ways. ++Currently, the maximum number of LUNs that can be scanned for each ++device is 128. ++ ++The kernel must be configured to have multiple LUN support enabled ++in order for non-zero LUNs to be configured and accessible. Use ++"make menuconfig" (as described in step 6, section 5.1) to build a ++kernel which has the option under SCSI Support enabled to probe all ++LUNs on SCSI devices. ++ ++ ++NOTE: If you have multiple adapters, set max_scsi_luns to the ++ largest number of LUNs supported by any one of these adapters. ++ ++- To configure multiple LUN support during boot time, type the ++following at the boot prompt: ++ ++boot: linux max_scsi_luns=128 ++ ++- If the SCSI Mid-Layer is compiled as a module, add the following ++line to the /etc/modules.conf file to scan for multiple LUNs at ++each boot: ++ ++options scsi_mod max_scsi_luns=128 ++ ++- If the SCSI Mid-Layer is not compiled as a module, the boot loader ++can be configured to scan for multiple LUNs each time the system ++boots. ++ ++For LILO, perform the following steps: ++ ++a) Add the following line to each of the kernel images listed in the ++ /etc/lilo.conf file: ++ ++append="max_scsi_luns=128" ++ ++b) Run "lilo" and reboot the system. ++ ++For GRUB, perform the following steps: ++ ++a) Append the max_scsi_luns parameters to each of the kernel images ++listed in the /etc/grub.conf file. For example: ++ ++kernel /vmlinux-2.4.7-10 ro root=/dev/hda2 max_scsi_luns=128 ++ ++b) Reboot the system. ++ ++ ++6.2 NVRAM Parameters ++--------------------- ++ ++The NVRAM features described below are hard-coded in the Driver. The ++changes made for the particular NVRAM feature in the Fast!Util do not ++take effect unless otherwise noted. ++ ++None. ++ ++ ++6.3 Driver Command Line Parameters ++----------------------------------- ++ ++'verbose' and 'quiet' are the available command line options. ++ ++ verbose - Verbose detail debug information ++ ++ quiet - Driver does not display: ++ Waiting for LIP to complete.... ++ scsi%d: Topology - %s, Host Loop address 0x%x ++ scsi(%d): LIP occurred ++ scsi(%d): LIP reset occurred ++ ++ Usage examples: ++ ++ # insmod qla2200.o options = verbose ++ # insmod qla2300.o options = verbose ++ # insmod qla2200.o ql2xopts = quiet ++ # insmod qla2300.o ql2xopts = quiet ++ ++ ++********************************************************************** ++ ++ ++7. Limitations ++-------------- ++ ++ N/A ++ ++ ++********************************************************************** ++ ++ ++8. Additional Notes ++--------------------- ++ ++ ++8.1 Proc Filesystem Support ++----------------------------- ++ ++The /proc filesystem for the QLA2200 and QLA2300 driver can be found ++in the /proc/scsi/qla2200/ and /proc/scsi/qla2300/ directories. These ++directories contain a file for each QLogic Fibre Channel adapter ++in the system. Each file will present information about the adapter ++and transfer statistics for each discovered LUN. ++ ++ ++8.2 Co-existence of QLogic 4.x and 6.x Linux Drivers ++----------------------------------------------------- ++ ++The 4.x driver provides support for QLA2100, QLA2200, and QLA23xx. ++The 6.x driver supports the QLA2200 and QLA23xx only. To make the ++drivers "co-exist", perform the following: ++ ++ Option 1. 4.x support for QLA2100 ++ 6.x support for QLA2200 and QLA23xx ++ ++ o Remove QLA2200/QLA2300/QLA2312 support from the 4.x series ++ driver: ++ ++ - Edit the qla2x00.c file ++ ++ - Look for the following line: ++ ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #if 0 ++ ++ - The resulting lines should read as: ++ ++ #if 0 ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ #if 0 ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Look for the following line: ++ ++ {"QLA2100 ", QLA2100_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #endif ++ ++ - The resulting lines should read as: ++ ++ #endif ++ {"QLA2100 ", QLA2100_DEVICE_ID, MAX_BUSES, ++ ++ Option 2. 4.x support for QLA2100 and QLA2200 ++ 6.x support for QLA23xx ++ ++ o Remove QLA2300/QLA2312 support from the 4.x series driver: ++ ++ - Edit the qla2x00.c file ++ ++ - Look for the following line: ++ ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #if 0 ++ ++ - The resulting lines should read as: ++ ++ #if 0 ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ #if 0 ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Look for the following line: ++ ++ {"QLA2200 ", QLA2200_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #endif ++ ++ - The resulting lines should read as: ++ ++ #endif ++ {"QLA2200 ", QLA2200_DEVICE_ID, MAX_BUSES, ++ ++ ++8.3 Failover Support ++--------------------- ++ ++8.3.1 How to enable the Failover support in the Driver ++------------------------------------------------------- ++ ++Failover support can be enabled in the QLA2XXX driver by enabling the ++macro MPIO_SUPPORT in qla_settings.h file ie ++ ++#define MPIO_SUPPORT 1 ++ ++Note: The failover distribution package, qla2x00src-vx.yy.zz-fo.tgz, ++has the above macro enabled by default. ++ ++ ++8.3.2 Using SANsurfer with QLA2XXX Driver the First Time ++________________________________________________________ ++ ++1. To work with SANsurfer, the driver should always be built ++ with MPIO_SUPPORT set to 1 in qla_settings.h. ++ ++2. Add the following parameter in modules.conf file: ++ ++ options qla2200 ConfigRequired=1 ql2xopts= ++ or ++ options qla2300 ConfigRequired=1 ql2xopts= ++ ++3. Now you can load the driver and SANsurfer. ++ ++ ++8.3.3 Configuration Changes Made via SANsurfer ++-------------------------------------------- ++ ++1. LUN Masking ++ ++ For the new LUN masking configuration to take effect, the ++ driver must be reloaded. The following is an example of ++ the sequence of actions to take: ++ ++ - Load the driver: ++ ++ modprobe <driver> ++ ++ - Load the qlremote agent. ++ ++ - Start the GUI and connect it to the destination system. ++ ++ - Make LUN masking changes. ++ ++ - Disconnect the host from GUI and stop qlremote agent. ++ ++ - Unload the driver: ++ ++ modprobe -r <driver> ++ ++ - Reload the driver: ++ ++ modprobe <driver> ++ ++ - Load qlremote agent again. ++ ++ - Start the GUI and connect it to the destination system. ++ ++ Now you should see the updated LUN masking configuration. ++ ++Please note that when using modprobe to load the driver, the ++length of the option line specified in /etc/modules.conf file ++has a limit of 2K characters. Any longer option line will cause ++a string overflow error from modprobe. ++ ++ ++8.4 Persistent Binding ++______________________ ++ ++ ++The Persistent Binding information consists of some adapter parameter ++entries along with some target entries. However, the Linux entries ++have been shorten to save space on the command line. Currently, there ++is no limit on the size of the command line when using modprobe. But, ++if you embedded the driver in the kernel you are using lilo that has ++a string size limitation. ++ ++Persistent Binding can be specified in two ways. Manually or using ++SANsurfer. We recommend using SANsurfer for ease of use. Reference ++section 8.3.3 for additonal information about SANsurfer. The ++following is the procedure to manually add persistent binding ++commands: ++ ++The driver displays the current configuration when the displayConfig ++command line option is specified. The persistent binding ++configuration is found in /var/log/messages file. It prints the ++configuration information in the format required by the driver. ++The best way to extract configuration messages is to use grep and ++direct the output to a file. You need to remove the Linux timestamp at ++the beginning of each message and combine them together on single line. ++For example ++ #insmod qla2200 displayConfig=1 ++ #grep "scsi-qla" /var/log/messages > /tmp/info.cfg ++ ++The format of the persistent binding commands is as follows: ++ ++Device descriptions ++ ++scsi-qla<#>-adapter-port=<adapter port name value>; ++The designated by qla<#>, where the <#> is the adapter instance number. ++ ++The parameter specifies the FC port name to be used for the adapter. ++where <adapter port name value> is the FC port name value in hexa- ++ decimal format. If this entry is not specified in the conf file, ++ the default value is the adapter's port name as saved in the NVRAM. ++Example: ++scsi-qla00-adapter-port=210000e08b01158d\; ++ ++host adapter instance 0 has a portname of 210000e08b01158d ++ ++scsi-qla<#1>-tgt-<#2>-di-<#3>-node=<device FC name>; ++This parameter associates the specified <device FC name> with the ++SCSI target ID value specified by <#2> and a device id value specified ++by <#3>. where <device FC name> type is the FC node name of the ++device, and <#2> is the SCSI target ID to be assigned to the device ++and <#3> is the device unique id. ++Where ++ <#1> Specifies the adapter instance number ++ <#2> Specifies the SCSI ID of Target ++ <#3> Specifies the path/device id ++ ++scsi-qla<#1>-tgt-<#2>-di-<#3>-port=<device FC name>; ++This parameter associates the specified <device FC name> with the ++SCSI target ID value specified by <#2> and a device id value specified ++by <#3>. where <device FC name> type is the FC port ++Where ++ <#1> Specifies the adapter instance number ++ <#2> Specifies the SCSI ID of Target ++ <#3> Specifies the path/device id (always 0 for non-failover) ++ ++name of the device, and <#2> is the SCSI target ID to be assigned to ++the device and <#3> is the device unique id. ++ ++scsi-qla<#1>-tgt-<#2>-di-<#3>-disabled=<256 bit mask>; ++This parameter associates the specified <256 bit mask> with the ++SCSI target ID value specified by <#2> and a device id value specified ++by <#3>. ++ ++Where ++ <#1> Specifies the adapter instance number ++ <#2> Specifies the SCSI ID of Target ++ <#3> Specifies the path/device id ++ ++<256 bit mask> ++msb lsb ++ 000000000000000000000000000000000000000000000000000000000000000F ++ ++the mask above will make the first four luns, 3, 2, 1, and 0 of a ++given Target disabled on that target/path. ++ ++This mask specification is heavily type checked to be a sequence of ++64 hex digits. ++ ++********************************************************************** ++ ++ ++9. Diskette Content ++-------------------- ++ ++The qla2x00src-vx.yy.zz-*.tgz files can be extracted into the ++following files: ++ ++ listops.h ++ Makefile.kernel ++ Config.in ++ makefile ++ qla_settings.h ++ qla_debug.h ++ ql2100_fw.h ++ ql2200_fw.h ++ ql2300_fw.h ++ ql2200ip_fw.h ++ ql2300ip_fw.h ++ qla2100.c ++ qla2200.c ++ qla2300.c ++ qla2x00.c ++ qla2x00.h ++ qla2x00_ioctl.c ++ qla_vendor.c ++ qla_cfg.c ++ qla_cfgln.c ++ qla_fo.c ++ qla_fo.cfg ++ qla_inioct.c ++ qla_ip.c ++ qla_mbx.c ++ qla_mbx.h ++ exioctln.h ++ exioct.h ++ inioct.h ++ qla_cfg.h ++ qla_fo.h ++ qla_gbl.h ++ qla_ip.h ++ qlfo.h ++ qlfolimits.h ++ qlfoln.h ++ qla_version.h ++ revision.notes - Revision history ++ release.txt - Release notes ++ README.qla2x00 - This file ++ ++ ++********************************************************************** ++ ++ ++10. Contacting QLogic ++--------------------- ++ ++Please visit QLogic's website (www.qlogic.com). On this site you will ++find product information, our latest drivers, and links for technical ++assistance if needed. ++ ++ ++====================================================================== ++ ++ ++ Copyright (c) 2003 QLogic Corporation. All rights reserved ++ worldwide. +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/exioct.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,947 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * File Name: exioct.h ++ * ++ * San/Device Management Ioctl Header ++ * File is created to adhere to Solaris requirement using 8-space tabs. ++ * ++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!! ++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!! ++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!! ++ * ++ * Revision History: ++ * ++ * Rev. 0 March 1, 2000 ++ * YPL - Created. ++ * ++ * Rev. 1 March 2, 2000 ++ * RLU - Updated with latest definitions. Added more comments. ++ * ++ * Rev. 2 May 16, 2000 ++ * SP - Updated definitions and changed structures (March 27, 2000) ++ * SP - Addded structures ++ * ++ * Rev. 3 June 1, 2000 ++ * THL - Made major changes to include all changes talked in our meeting. ++ * ++ * Rev. 4 June 5, 2000 ++ * RLU - Added new definitions/structures for SDM_GET_AEN and SDM_REG_AEN ++ * functions. ++ * - Major definition/structure name changes as discussed in meetings. ++ * - Deleted duplicated command code and structure definitions. ++ * ++ * Rev. 4.1 June 14, 2000 ++ * WTR - Moved Solaris specific defines to exioctso.h. This makes it ++ * possible for application developers to include only exioct.h ++ * in their Solaris application development. ++ * ++ * Rev. 4.2 June 15, 2000 ++ * THL - Changed UINT16 and UINT32 back to WORD and DWORD for NT; otherwise, ++ * NT will get a compilation error for redefining UINT16 and UINT32. ++ * Added RISC_CODE/FLASH_RAM macros. ++ * ++ * Rev. 4.3 June 22, 2000 ++ * THL - Changed SDM_FC_ADDR according to External Ioctls document. ++ * Added SDM_DEF_TYPE macros. ++ * ++ * Rev. 4.4 June 22, 2000 ++ * THL - Moved NT specific defines to exioctnt.h. ++ * ++ * Rev. 4.5 August 15, 2000 ++ * SP - Rolled back some changes made by Todd R. ++ * Kept new status code SDM_STATUS_NO_MEMORY ++ * Port types fabric and tape device ++ * ++ * Rev. 4.7 Sep 6, 2000 ++ * YPL - Replace SDM_ with EXT_, _ISP with _CHIP. ++ * Add vendor specific statuses, device update, config defines. ++ * ++ * Rev. 5.0 Sep 13, 2000 ++ * YPL - Update version to 5, remove max defines, make port type bit. ++ * Change HBA_PORT_PROPERTY to have bus/target/lun defined as UINT16 ++ * ++ * Rev. 5.1 Sep 22, 2000 ++ * THL - Add destination address for specify scsi address or FC address. ++ * Remove "not support" comment and add more macros. ++ * ++ * Rev. 5.2 Sep 27, 2000 ++ * THL - Add new macros and structure for add and swap target device. ++ * Create new data structure for get port database. ++ * TLE - Merge changes needed for FailOver ++ * ++ * Rev. 5.3 Sep 29, 2000 ++ * THL - Add access mode for NVRAM. ++ * ++ * Rev. 5.4 Oct 03, 2000 ++ * THL - Add EXT_SC_GET_FC_STATISTICS. ++ * ++ * Rev. 5.5 Oct 18, 2000 ++ * THL - Remove duplicated EXT_DEF_ADDR_MODE_32 and EXT_DEF_ADDR_MODE_16. ++ * Reformat new data structures and defines. ++ * ++ * Rev. 5.6 Oct 19, 2000 ++ * RLU - Changed file name from ExIoct.h to exioct.h. ++ * - Added definition of EXT_RNID_DATA for API implementation. ++ * - Reformat some lines to conform to the format agreed ++ * upon in IOCTL meeting (and mentioned at beginning of ++ * this file). ++ * ++ * Rev. 5.7 Oct 25, 2000 ++ * BN - Added LUN bitmask structure and macros ++ * ++ * Rev. 5.8 Oct 25, 2000 ++ * BN - Added EXT_CC_DRIVER_PROP define ++ * ++ * Rev. 5.9 Oct 26, 2000 ++ * BN - Sync with UnixApi project ++ * ++ * Rev. 5.10 Oct 30, 2000 ++ * BN - Remove not needed #define for EXT_CC_DRIVER_PROP ++ * - Add EXT_ to IS_LUN_BIT_SET, SET_LUN_BIT, CLR_LUN_BIT ++ * ++ * Rev. 5.11 Nov 1, 2000 ++ * BN - Increased [1] of EXT_DEVICEDATA to [EXT_MAX_TARGET] ++ * TLE - Decreased [EXT_MAX_TARGET] of EXT_DEVICEDATA to [1] ++ * ++ * Rev. 5.12 Nov 7, 2000 ++ * RLU - Deleted EXT_DEF_MAX_LUNS define and changed all references ++ * to it to use EXT_MAX_LUN. ++ * - Changed the revision numbers for the last 2 revisions down ++ * to use 5.x. ++ * ++ * Rev. 5.13 Nov 14, 2000 ++ * WTR - Fixed pointer referencing problem in the LUN_BIT_MASK macros. ++ * Updated comment at bit mask definition. ++ * ++ * Rev. 5.14 Dec 6, 2000 ++ * THL - Added Local and LoopID to discovered port/target property. ++ * ++ * Rev. 5.15 Dec 24, 2000 ++ * YPL - Enhance port connection modes and driver attrib ++ * ++ * Rev. 5.16 Dec 27, 2000 ++ * TLE - Add BufferHandle member to _EXT_ASYNC_EVENT data structure for ++ * SCTP support ++ * ++ * Rev. 5.17 Jan 10, 2001 ++ * YPL - Add edtov, ratov & fabric name in port property ++ * ++ * Rev. 5.18 Feb 28, 2001 ++ * YPL - Remove SCTP fields and add fabric parameter flags in port property ++ * ++ * Rev. 5.19 Mar 08, 2001 ++ * YPL - Remove SCTP fields from hba port prop ++ * ++ * Rev. 5.20 June 11, 2001 ++ * YPL - Change to reserved fields and add fabric name field in port property ++ * ++ * Rev. 5.21 June 29, 2001 ++ * YPL - Merge in changes decided long time ago (use _DEF_ for defines) & ++ * reserved some EXT_CC for legacy ioctls, plus add RNID dataformat ++ * values definition ++ * ++ * Rev. 5.21 Sep 18, 2001 ++ * SP - Added New return status codes ++ * ++ * Rev. 5.22 Oct 23, 2001 ++ * SP - Change reserve fields to add fields to EXT_HBA_PORT ++ * Added port speeds and FC4Types fields and related definitions ++ * ++ * Rev. 5.23 Dec 04, 2001 ++ * RL - Added port speed value definition. ++ * ++ * Rev. 5.24 Jan 20, 2002 ++ * JJ - Added PCI device function bits field in EXT_CHIP structure. ++ * ++ * Rev. 5.25 Feb 04, 2002 ++ * JJ - Added 16 bytes CDB support. Also added SenseLength field ++ * in SCSI_PASSTHRU structure. ++ * ++ * Rev. 5.26 Feb 12, 2002 ++ * AV - Changed type size used in SCSI_PASSTHRU structure definitions ++ * to re-enable gcc's automatic structure padding for backward ++ * compatibility. ++ * ++ * Rev. 5.27 Mar 01, 2002 ++ * RL - Added new SC value for SCSI3 command passthru. ++ * ++ * Rev. 5.28 Dec 09, 2002 ++ * Sync up with NT version of exioct.h: ++ * TLE - Modify EXT_RNID_REQ data structure for IBM SendRNID workaround ++ * YPL - Add firmware state (online diagnostics) ++ * YPL - Add ELS PS ++ * YPL - Add els event, # of els buffers & size ++ */ ++ ++#ifndef _EXIOCT_H ++#define _EXIOCT_H ++ ++/* ++ * NOTE: the following version defines must be updated each time the ++ * changes made may affect the backward compatibility of the ++ * input/output relations of the SDM IOCTL functions. ++ */ ++#define EXT_VERSION 5 ++ ++ ++/* ++ * OS independent General definitions ++ */ ++#define EXT_DEF_SIGNATURE_SIZE 8 ++#define EXT_DEF_WWN_NAME_SIZE 8 ++#define EXT_DEF_WWP_NAME_SIZE 8 ++#define EXT_DEF_SERIAL_NUM_SIZE 4 ++#define EXT_DEF_PORTID_SIZE 4 ++#define EXT_DEF_PORTID_SIZE_ACTUAL 3 ++#define EXT_DEF_MAX_STR_SIZE 128 ++#define EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH 16 ++ ++#define EXT_DEF_ADDR_MODE_32 1 ++#define EXT_DEF_ADDR_MODE_64 2 ++ ++/* ++ * *********************************************************************** ++ * X OS type definitions ++ * *********************************************************************** ++ */ ++#ifdef _MSC_VER /* NT */ ++ ++#pragma pack(1) ++#include "ExIoctNT.h" ++ ++#elif defined(linux) /* Linux */ ++ ++#include "exioctln.h" ++ ++#elif defined(sun) || defined(__sun) /* Solaris */ ++ ++#include "exioctso.h" ++ ++#endif ++ ++/* ++ * *********************************************************************** ++ * OS dependent General configuration defines ++ * *********************************************************************** ++ */ ++#define EXT_DEF_MAX_HBA EXT_DEF_MAX_HBA_OS ++#define EXT_DEF_MAX_BUS EXT_DEF_MAX_BUS_OS ++#define EXT_DEF_MAX_TARGET EXT_DEF_MAX_TARGET_OS ++#define EXT_DEF_MAX_LUN EXT_DEF_MAX_LUN_OS ++ ++/* ++ * *********************************************************************** ++ * Common header struct definitions for San/Device Mgmt ++ * *********************************************************************** ++ */ ++typedef struct { ++ UINT64 Signature; /* 8 chars string */ ++ UINT16 AddrMode; /* 2 */ ++ UINT16 Version; /* 2 */ ++ UINT16 SubCode; /* 2 */ ++ UINT16 Instance; /* 2 */ ++ UINT32 Status; /* 4 */ ++ UINT32 DetailStatus; /* 4 */ ++ UINT32 Reserved1; /* 4 */ ++ UINT32 RequestLen; /* 4 */ ++ UINT32 ResponseLen; /* 4 */ ++ UINT64 RequestAdr; /* 8 */ ++ UINT64 ResponseAdr; /* 8 */ ++ UINT16 HbaSelect; /* 2 */ ++ UINT16 VendorSpecificStatus[11]; /* 22 */ ++ UINT64 VendorSpecificData; /* 8 chars string */ ++} EXT_IOCTL, *PEXT_IOCTL; /* 84 / 0x54 */ ++ ++/* ++ * Addressing mode used by the user application ++ */ ++#define EXT_ADDR_MODE EXT_ADDR_MODE_OS ++ ++/* ++ * Status. These macros are being used for setting Status field in ++ * EXT_IOCTL structure. ++ */ ++#define EXT_STATUS_OK 0 ++#define EXT_STATUS_ERR 1 ++#define EXT_STATUS_BUSY 2 ++#define EXT_STATUS_PENDING 3 ++#define EXT_STATUS_SUSPENDED 4 ++#define EXT_STATUS_RETRY_PENDING 5 ++#define EXT_STATUS_INVALID_PARAM 6 ++#define EXT_STATUS_DATA_OVERRUN 7 ++#define EXT_STATUS_DATA_UNDERRUN 8 ++#define EXT_STATUS_DEV_NOT_FOUND 9 ++#define EXT_STATUS_COPY_ERR 10 ++#define EXT_STATUS_MAILBOX 11 ++#define EXT_STATUS_UNSUPPORTED_SUBCODE 12 ++#define EXT_STATUS_UNSUPPORTED_VERSION 13 ++#define EXT_STATUS_MS_NO_RESPONSE 14 ++#define EXT_STATUS_SCSI_STATUS 15 ++#define EXT_STATUS_BUFFER_TOO_SMALL 16 ++#define EXT_STATUS_NO_MEMORY 17 ++#define EXT_STATUS_UNKNOWN 18 ++#define EXT_STATUS_UNKNOWN_DSTATUS 19 ++#define EXT_STATUS_INVALID_REQUEST 20 ++ ++#define EXT_STATUS_DEVICE_NOT_READY 21 ++#define EXT_STATUS_DEVICE_OFFLINE 22 ++#define EXT_STATUS_HBA_NOT_READY 23 ++#define EXT_STATUS_HBA_QUEUE_FULL 24 ++ ++/* ++ * Detail Status contains the SCSI bus status codes. ++ */ ++ ++#define EXT_DSTATUS_GOOD 0x00 ++#define EXT_DSTATUS_CHECK_CONDITION 0x02 ++#define EXT_DSTATUS_CONDITION_MET 0x04 ++#define EXT_DSTATUS_BUSY 0x08 ++#define EXT_DSTATUS_INTERMEDIATE 0x10 ++#define EXT_DSTATUS_INTERMEDIATE_COND_MET 0x14 ++#define EXT_DSTATUS_RESERVATION_CONFLICT 0x18 ++#define EXT_DSTATUS_COMMAND_TERMINATED 0x22 ++#define EXT_DSTATUS_QUEUE_FULL 0x28 ++ ++/* ++ * Detail Status contains the needed Response buffer space(bytes) ++ * when Status = EXT_STATUS_BUFFER_TOO_SMALL ++ */ ++ ++ ++/* ++ * Detail Status contains one of the following codes ++ * when Status = EXT_STATUS_INVALID_PARAM or ++ * = EXT_STATUS_DEV_NOT_FOUND ++ */ ++#define EXT_DSTATUS_NOADNL_INFO 0x00 ++#define EXT_DSTATUS_HBA_INST 0x01 ++#define EXT_DSTATUS_TARGET 0x02 ++#define EXT_DSTATUS_LUN 0x03 ++#define EXT_DSTATUS_REQUEST_LEN 0x04 ++#define EXT_DSTATUS_PATH_INDEX 0x05 ++ ++/* ++ * Currently supported DeviceControl / ioctl command codes ++ */ ++#define EXT_CC_QUERY EXT_CC_QUERY_OS ++#define EXT_CC_SEND_FCCT_PASSTHRU EXT_CC_SEND_FCCT_PASSTHRU_OS ++#define EXT_CC_REG_AEN EXT_CC_REG_AEN_OS ++#define EXT_CC_GET_AEN EXT_CC_GET_AEN_OS ++#define EXT_CC_SEND_ELS_RNID EXT_CC_SEND_ELS_RNID_OS ++#define EXT_CC_SEND_SCSI_PASSTHRU EXT_CC_SCSI_PASSTHRU_OS ++#define EXT_CC_SEND_ELS_PASSTHRU EXT_CC_SEND_ELS_PASSTHRU_OS ++ ++/* ++ * HBA port operations ++ */ ++#define EXT_CC_GET_DATA EXT_CC_GET_DATA_OS ++#define EXT_CC_SET_DATA EXT_CC_SET_DATA_OS ++ ++ ++/* Reserved command codes. */ ++#define EXT_CC_RESERVED0A EXT_CC_RESERVED0A_OS ++#define EXT_CC_RESERVED0B EXT_CC_RESERVED0B_OS ++#define EXT_CC_RESERVED0C EXT_CC_RESERVED0C_OS ++#define EXT_CC_RESERVED0D EXT_CC_RESERVED0D_OS ++#define EXT_CC_RESERVED0E EXT_CC_RESERVED0E_OS ++#define EXT_CC_RESERVED0F EXT_CC_RESERVED0F_OS ++#define EXT_CC_RESERVED0G EXT_CC_RESERVED0G_OS ++#define EXT_CC_RESERVED0H EXT_CC_RESERVED0H_OS ++#define EXT_CC_RESERVED0I EXT_CC_RESERVED0I_OS ++#define EXT_CC_RESERVED0J EXT_CC_RESERVED0J_OS ++#define EXT_CC_RESERVED0Z EXT_CC_RESERVED0Z_OS ++ ++ ++/* ++ * *********************************************************************** ++ * EXT_IOCTL SubCode definition. ++ * These macros are being used for setting SubCode field in EXT_IOCTL ++ * structure. ++ * *********************************************************************** ++ */ ++ ++/* ++ * Query. ++ * Uses with EXT_QUERY as the ioctl code. ++ */ ++#define EXT_SC_QUERY_HBA_NODE 1 ++#define EXT_SC_QUERY_HBA_PORT 2 ++#define EXT_SC_QUERY_DISC_PORT 3 ++#define EXT_SC_QUERY_DISC_TGT 4 ++#define EXT_SC_QUERY_DISC_LUN 5 /* Currently Not Supported */ ++#define EXT_SC_QUERY_DRIVER 6 ++#define EXT_SC_QUERY_FW 7 ++#define EXT_SC_QUERY_CHIP 8 ++ ++/* ++ * Sub codes for Get Data. ++ * Use in combination with EXT_GET_DATA as the ioctl code ++ */ ++/* 1 - 99 Common */ ++#define EXT_SC_GET_SCSI_ADDR 1 /* Currently Not Supported */ ++#define EXT_SC_GET_ERR_DETECTIONS 2 /* Currently Not Supported */ ++#define EXT_SC_GET_STATISTICS 3 ++#define EXT_SC_GET_BUS_MODE 4 /* Currently Not Supported */ ++#define EXT_SC_GET_DR_DUMP_BUF 5 /* Currently Not Supported */ ++#define EXT_SC_GET_RISC_CODE 6 /* Currently Not Supported */ ++#define EXT_SC_GET_FLASH_RAM 7 /* for backward compatible */ ++ ++/* 100 - 199 FC_INTF_TYPE */ ++#define EXT_SC_GET_LINK_STATUS 101 /* Currently Not Supported */ ++#define EXT_SC_GET_LOOP_ID 102 /* Currently Not Supported */ ++#define EXT_SC_GET_LUN_BITMASK 103 ++#define EXT_SC_GET_PORT_DATABASE 104 /* Currently Not Supported */ ++#define EXT_SC_GET_PORT_DATABASE_MEM 105 /* Currently Not Supported */ ++#define EXT_SC_GET_PORT_SUMMARY 106 ++#define EXT_SC_GET_POSITION_MAP 107 ++#define EXT_SC_GET_RETRY_CNT 108 /* Currently Not Supported */ ++#define EXT_SC_GET_RNID 109 ++#define EXT_SC_GET_RTIN 110 /* Currently Not Supported */ ++#define EXT_SC_GET_FC_LUN_BITMASK 111 ++#define EXT_SC_GET_FC_STATISTICS 112 /* for backward compatible */ ++ ++/* 200 - 299 SCSI_INTF_TYPE */ ++#define EXT_SC_GET_SEL_TIMEOUT 201 /* Currently Not Supported */ ++ ++ ++/* ++ * Sub codes for Set Data. ++ * Use in combination with EXT_SET_DATA as the ioctl code ++ */ ++/* 1 - 99 Common */ ++#define EXT_SC_RST_STATISTICS 3 ++#define EXT_SC_RESERVED_BC7 7 ++ ++/* 100 - 199 FC_INTF_TYPE */ ++#define EXT_SC_SET_LUN_BITMASK 103 ++#define EXT_SC_SET_RNID 109 ++#define EXT_SC_SET_FC_LUN_BITMASK 111 ++#define EXT_SC_RESERVED_BC112 112 ++#define EXT_SC_RESERVED_BC113 113 ++ ++/* 200 - 299 SCSI_INTF_TYPE */ ++ ++/* SCSI passthrough */ ++#define EXT_SC_SEND_SCSI_PASSTHRU 0 ++#define EXT_SC_SEND_FC_SCSI_PASSTHRU 1 ++#define EXT_SC_SCSI3_PASSTHRU 2 ++ ++/* Read */ ++ ++/* Write */ ++ ++/* Reset */ ++ ++/* Request struct */ ++ ++ ++/* ++ * Response struct ++ */ ++typedef struct _EXT_HBA_NODE { ++ UINT8 WWNN [EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Manufacturer [EXT_DEF_MAX_STR_SIZE]; /* 128; "QLOGIC" */ ++ UINT8 Model [EXT_DEF_MAX_STR_SIZE]; /* 128; "QLA2200" */ ++ UINT8 SerialNum [EXT_DEF_SERIAL_NUM_SIZE];/* 4; 123 */ ++ UINT8 DriverVersion[EXT_DEF_MAX_STR_SIZE]; /* 128; "7.4.3" */ ++ UINT8 FWVersion [EXT_DEF_MAX_STR_SIZE]; /* 128; "2.1.6" */ ++ ++ /* The following field is currently not supported */ ++ UINT8 OptRomVersion[EXT_DEF_MAX_STR_SIZE]; /* 128; "1.44" */ ++ ++ UINT16 PortCount; /* 2; 1 */ ++ UINT16 InterfaceType; /* 2; FC/SCSI */ ++ ++ /* The following two fields are not yet supported */ ++ UINT32 DriverAttr; /* 4 */ ++ UINT32 FWAttr; /* 4 */ ++ ++ UINT32 Reserved[8]; /* 32 */ ++} EXT_HBA_NODE, *PEXT_HBA_NODE; /* 696 */ ++ ++/* HBA node query interface type */ ++#define EXT_DEF_FC_INTF_TYPE 1 ++#define EXT_DEF_SCSI_INTF_TYPE 2 ++ ++typedef struct _EXT_HBA_PORT { ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id [EXT_DEF_PORTID_SIZE]; /* 4; 3 bytes valid Port Id. */ ++ UINT16 Type; /* 2; Port Type */ ++ UINT16 State; /* 2; Port State */ ++ UINT16 Mode; /* 2 */ ++ UINT16 DiscPortCount; /* 2 */ ++ UINT16 DiscPortNameType; /* 2; USE_NODE_NAME or */ ++ /* USE_PORT_NAME */ ++ UINT16 DiscTargetCount; /* 2 */ ++ UINT16 Bus; /* 2 */ ++ UINT16 Target; /* 2 */ ++ UINT16 Lun; /* 2 */ ++ /* 2 */ ++ UINT8 PortSupportedFC4Types; ++ UINT8 PortActiveFC4Types; ++ UINT8 FabricName[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ ++ /* 2*/ ++ UINT8 PortSupportedSpeed; ++ UINT8 PortSpeed; ++ UINT16 Unused; /* 2 */ ++ UINT32 Reserved[3]; /* 12 */ ++} EXT_HBA_PORT, *PEXT_HBA_PORT; /* 56 */ ++ ++/* port type */ ++#define EXT_DEF_INITIATOR_DEV 1 ++#define EXT_DEF_TARGET_DEV 2 ++#define EXT_DEF_TAPE_DEV 4 ++#define EXT_DEF_FABRIC_DEV 8 ++ ++ ++/* HBA port state */ ++#define EXT_DEF_HBA_OK 0 ++#define EXT_DEF_HBA_SUSPENDED 1 ++#define EXT_DEF_HBA_LOOP_DOWN 2 ++ ++/* Connection mode */ ++#define EXT_DEF_UNKNOWN_MODE 0 ++#define EXT_DEF_P2P_MODE 1 ++#define EXT_DEF_LOOP_MODE 2 ++#define EXT_DEF_FL_MODE 3 ++#define EXT_DEF_N_MODE 4 ++ ++/* Valid name type for Disc. port/target */ ++#define EXT_DEF_USE_NODE_NAME 1 ++#define EXT_DEF_USE_PORT_NAME 2 ++ ++/* FC4 type values */ ++#define EXT_DEF_FC4_TYPE_SCSI 0x1 ++#define EXT_DEF_FC4_TYPE_IP 0x2 ++#define EXT_DEF_FC4_TYPE_SCTP 0x4 ++#define EXT_DEF_FC4_TYPE_VI 0x8 ++ ++/* Port Speed values */ ++#define EXT_DEF_PORTSPEED_1GBIT 1 ++#define EXT_DEF_PORTSPEED_2GBIT 2 ++#define EXT_DEF_PORTSPEED_10GBIT 4 ++ ++typedef struct _EXT_DISC_PORT { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id [EXT_DEF_PORTID_SIZE]; ++ /* 4; last 3 bytes used. big endian */ ++ ++ /* The following fields currently are not supported */ ++ UINT16 Type; /* 2; Port Type */ ++ UINT16 Status; /* 2; Port Status */ ++ UINT16 Bus; /* 2; n/a for Solaris */ ++ ++ UINT16 TargetId; /* 2 */ ++ UINT8 Local; /* 1; Local or Remote */ ++ UINT8 ReservedByte[1]; /* 1 */ ++ ++ UINT16 LoopID; /* 2; Loop ID */ ++ ++ UINT32 Reserved[7]; /* 28 */ ++} EXT_DISC_PORT, *PEXT_DISC_PORT; /* 60 */ ++ ++typedef struct _EXT_DISC_TARGET { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id [EXT_DEF_PORTID_SIZE]; ++ /* 4; last 3 bytes used. big endian */ ++ ++ /* The following fields currently are not supported */ ++ UINT16 Type; /* 2; Target Type */ ++ UINT16 Status; /* 2; Target Status*/ ++ UINT16 Bus; /* 2; n/a for Solaris */ ++ ++ UINT16 TargetId; /* 2 */ ++ ++ /* The following field is currently not supported */ ++ UINT16 LunCount; /* 2; n/a for nt */ ++ ++ UINT8 Local; /* 1; Local or Remote */ ++ UINT8 ReservedByte[1]; /* 1 */ ++ ++ UINT16 LoopID; /* 2; Loop ID */ ++ ++ UINT16 Reserved[13]; /* 26 */ ++} EXT_DISC_TARGET, *PEXT_DISC_TARGET; /* 60 */ ++ ++/* The following command is not supported */ ++typedef struct _EXT_DISC_LUN { /* n/a for nt */ ++ UINT16 Id; /* 2 */ ++ UINT16 State; /* 2 */ ++ UINT16 IoCount; /* 2 */ ++ UINT16 Reserved[15]; /* 30 */ ++} EXT_DISC_LUN, *PEXT_DISC_LUN; /* 36 */ ++ ++ ++/* SCSI address */ ++typedef struct _EXT_SCSI_ADDR { ++ UINT16 Bus; /* 2 */ ++ UINT16 Target; /* 2 */ ++ UINT16 Lun; /* 2 */ ++ UINT16 Padding[5]; /* 10 */ ++} EXT_SCSI_ADDR, *PEXT_SCSI_ADDR; /* 16 */ ++ ++ ++/* Fibre Channel address */ ++typedef struct _EXT_FC_ADDR { ++ union { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ } FcAddr; ++ UINT16 Type; /* 2 */ ++ UINT16 Padding[2]; /* 2 */ ++} EXT_FC_ADDR, *PEXT_FC_ADDR; /* 24 */ ++ ++#define EXT_DEF_TYPE_WWNN 1 ++#define EXT_DEF_TYPE_WWPN 2 ++#define EXT_DEF_TYPE_PORTID 3 ++#define EXT_DEF_TYPE_FABRIC 4 ++ ++ ++/* Destination address */ ++typedef struct _EXT_DEST_ADDR { ++ union { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ struct { ++ UINT16 Bus; /* 2 */ ++ UINT16 Target; /* 2 */ ++ } ScsiAddr; ++ } DestAddr; ++ UINT16 DestType; /* 2 */ ++ UINT16 Lun; /* 2 */ ++ UINT16 Padding[2]; /* 4 */ ++} EXT_DEST_ADDR, *PEXT_DEST_ADDR; /* 16 */ ++ ++ ++#define EXT_DEF_DESTTYPE_WWNN 1 ++#define EXT_DEF_DESTTYPE_WWPN 2 ++#define EXT_DEF_DESTTYPE_PORTID 3 ++#define EXT_DEF_DESTTYPE_FABRIC 4 ++#define EXT_DEF_DESTTYPE_SCSI 5 ++ ++/* Statistic */ ++typedef struct _EXT_HBA_PORT_STAT { ++ UINT32 ControllerErrorCount; /* 4 */ ++ UINT32 DeviceErrorCount; /* 4 */ ++ UINT32 TotalIoCount; /* 4 */ ++ UINT32 TotalMBytes; /* 4; MB of data processed */ ++ UINT32 TotalLipResets; /* 4; Total no. of LIP Reset */ ++ UINT32 Reserved2; /* 4 */ ++ UINT32 TotalLinkFailures; /* 4 */ ++ UINT32 TotalLossOfSync; /* 4 */ ++ UINT32 TotalLossOfSignals; /* 4 */ ++ UINT32 PrimitiveSeqProtocolErrorCount;/* 4 */ ++ UINT32 InvalidTransmissionWordCount; /* 4 */ ++ UINT32 InvalidCRCCount; /* 4 */ ++ UINT32 Reserved[16]; /* 64 */ ++} EXT_HBA_PORT_STAT, *PEXT_HBA_PORT_STAT; /* 112 */ ++ ++ ++/* Driver property */ ++typedef struct _EXT_DRIVER { ++ UINT8 Version[EXT_DEF_MAX_STR_SIZE];/* 128 */ ++ UINT16 NumOfBus; /* 2; Port Type */ ++ UINT16 TargetsPerBus; /* 2; Port Status */ ++ UINT16 LunsPerTarget; /* 2 */ ++ UINT32 MaxTransferLen; /* 4 */ ++ UINT32 MaxDataSegments; /* 4 */ ++ UINT16 DmaBitAddresses; /* 2 */ ++ UINT16 IoMapType; /* 2 */ ++ UINT32 Attrib; /* 4 */ ++ UINT32 InternalFlags[4]; /* 16 */ ++ UINT32 Reserved[8]; /* 32 */ ++} EXT_DRIVER, *PEXT_DRIVER; /* 198 */ ++ ++ ++/* Firmware property */ ++typedef struct _EXT_FW { ++ UINT8 Version[EXT_DEF_MAX_STR_SIZE];/* 128 */ ++ UINT32 Attrib; /* 4 */ ++ UINT16 Reserved[33]; /* 66 */ ++} EXT_FW, *PEXT_FW; /* 198 */ ++ ++ ++/* ISP/Chip property */ ++typedef struct _EXT_CHIP { ++ UINT16 VendorId; /* 2 */ ++ UINT16 DeviceId; /* 2 */ ++ UINT16 SubVendorId; /* 2 */ ++ UINT16 SubSystemId; /* 2 */ ++ UINT16 PciBusNumber; /* 2 */ ++ UINT16 PciSlotNumber; /* 2 */ ++ UINT32 IoAddr; /* 4 */ ++ UINT32 IoAddrLen; /* 4 */ ++ UINT32 MemAddr; /* 4 */ ++ UINT32 MemAddrLen; /* 4 */ ++ UINT16 ChipType; /* 2 */ ++ UINT16 InterruptLevel; /* 2 */ ++ UINT16 OutMbx[8]; /* 16 */ ++ UINT16 PciDevFunc; /* 2 */ ++ UINT16 Reserved[15]; /* 30 */ ++} EXT_CHIP, *PEXT_CHIP; /* 80 */ ++ ++ ++/* Request Buffer for RNID */ ++typedef struct _EXT_RNID_REQ { ++ EXT_FC_ADDR Addr; /* 14 */ ++ UINT8 DataFormat; /* 1 */ ++ UINT8 Pad; /* 1 */ ++ UINT8 OptWWN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 OptPortId[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ UINT32 Reserved[12]; /* 48 */ ++ UINT8 Pad1[3]; /* 3 */ ++} EXT_RNID_REQ, *PEXT_RNID_REQ; /* 79 */ ++ ++#define EXT_DEF_RNID_DFORMAT_NONE 0 ++#define EXT_DEF_RNID_DFORMAT_TOPO_DISC 0xDF ++ ++/* Request Buffer for Set RNID */ ++typedef struct _EXT_SET_RNID_REQ { ++ UINT8 IPVersion[2]; ++ UINT8 UDPPortNumber[2]; ++ UINT8 IPAddress[16]; ++ UINT32 Reserved[16]; ++} EXT_SET_RNID_REQ, *PEXT_SET_RNID_REQ; ++ ++/* RNID definition and data struct */ ++#define SEND_RNID_RSP_SIZE 72 ++ ++typedef struct _RNID_DATA ++{ ++ UINT8 WWN[16]; /* 16 */ ++ UINT32 UnitType; /* 4 */ ++ UINT8 PortId[4]; /* 4 */ ++ UINT32 NumOfAttachedNodes; /* 4 */ ++ UINT8 IPVersion[2]; /* 2 */ ++ UINT8 UDPPortNumber[2]; /* 2 */ ++ UINT8 IPAddress[16]; /* 16 */ ++ UINT16 Reserved; /* 2 */ ++ UINT16 TopoDiscFlags; /* 2 */ ++} EXT_RNID_DATA, *PEXT_RNID_DATA; /* 52 */ ++ ++ ++/* SCSI pass-through */ ++typedef struct _EXT_SCSI_PASSTHRU { ++ EXT_SCSI_ADDR TargetAddr; ++ UINT8 Direction; ++ UINT8 CdbLength; ++ UINT8 Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH]; ++ UINT32 Reserved[14]; ++ UINT16 Reserved2; ++ UINT16 SenseLength; ++ UINT8 SenseData[256]; ++} EXT_SCSI_PASSTHRU, *PEXT_SCSI_PASSTHRU; ++ ++/* FC SCSI pass-through */ ++typedef struct _EXT_FC_SCSI_PASSTHRU { ++ EXT_DEST_ADDR FCScsiAddr; ++ UINT8 Direction; ++ UINT8 CdbLength; ++ UINT8 Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH]; ++ UINT32 Reserved[14]; ++ UINT16 Reserved2; ++ UINT16 SenseLength; ++ UINT8 SenseData[256]; ++} EXT_FC_SCSI_PASSTHRU, *PEXT_FC_SCSI_PASSTHRU; ++ ++/* SCSI pass-through direction */ ++#define EXT_DEF_SCSI_PASSTHRU_DATA_IN 1 ++#define EXT_DEF_SCSI_PASSTHRU_DATA_OUT 2 ++ ++ ++/* EXT_REG_AEN Request struct */ ++typedef struct _EXT_REG_AEN { ++ UINT32 Enable; /* 4; non-0 to enable, 0 to disable. */ ++ UINT32 Reserved; /* 4 */ ++} EXT_REG_AEN, *PEXT_REG_AEN; /* 8 */ ++ ++/* EXT_GET_AEN Response struct */ ++typedef struct _EXT_ASYNC_EVENT { ++ UINT32 AsyncEventCode; /* 4 */ ++ union { ++ struct { ++ UINT8 RSCNInfo[EXT_DEF_PORTID_SIZE_ACTUAL];/* 3, BE */ ++ UINT8 AddrFormat; /* 1 */ ++ UINT32 Rsvd_1[2]; /* 8 */ ++ } RSCN; ++ ++ UINT32 Reserved[3]; /* 12 */ ++ } Payload; ++} EXT_ASYNC_EVENT, *PEXT_ASYNC_EVENT; /* 16 */ ++ ++ ++/* Asynchronous Event Codes */ ++#define EXT_DEF_LIP_OCCURRED 0x8010 ++#define EXT_DEF_LINK_UP 0x8011 ++#define EXT_DEF_LINK_DOWN 0x8012 ++#define EXT_DEF_LIP_RESET 0x8013 ++#define EXT_DEF_RSCN 0x8015 ++#define EXT_DEF_DEVICE_UPDATE 0x8014 ++#define EXT_DEF_ELS 0x8200 ++ ++/* Required # of entries in the queue buffer allocated. */ ++#define EXT_DEF_MAX_AEN_QUEUE EXT_DEF_MAX_AEN_QUEUE_OS ++#define EXT_DEF_MAX_ELS_BUFS EXT_DEF_MAX_ELS_BUFS_OS ++#define EXT_DEF_SIZE_ELS_BUF EXT_DEF_SIZE_ELS_BUF_OS ++ ++/* Device type to get for EXT_SC_GET_PORT_SUMMARY */ ++#define EXT_DEF_GET_KNOWN_DEVICE 0x1 ++#define EXT_DEF_GET_VISIBLE_DEVICE 0x2 ++#define EXT_DEF_GET_HIDDEN_DEVICE 0x4 ++#define EXT_DEF_GET_FABRIC_DEVICE 0x8 ++#define EXT_DEF_GET_LOOP_DEVICE 0x10 ++ ++/* Each entry in device database */ ++typedef struct _EXT_DEVICEDATAENTRY ++{ ++ UINT8 NodeWWN[8]; /* Node World Wide Name for device */ ++ UINT8 PortWWN[8]; /* Port World Wide Name for device */ ++ UINT8 PortID[3]; /* Current PortId for device */ ++ UINT8 ControlFlags; /* Control flag */ ++ EXT_SCSI_ADDR TargetAddress; /* scsi address */ ++ UINT32 DeviceFlags; /* Flags for device */ ++ UINT16 LoopID; /* Loop ID */ ++ UINT16 BaseLunNumber; ++ UINT32 Reserved[32]; ++} EXT_DEVICEDATAENTRY, *PEXT_DEVICEDATAENTRY; ++ ++/* Device database information */ ++typedef struct _EXT_DEVICEDATA ++{ ++ UINT32 TotalDevices; /* Set to total number of device. */ ++ UINT32 ReturnListEntryCount; /* Set to number of device entries */ ++ /* returned in list. */ ++ ++ EXT_DEVICEDATAENTRY EntryList[1]; /* Variable length */ ++} EXT_DEVICEDATA, *PEXT_DEVICEDATA; ++ ++ ++/* Swap Target Device Data structure */ ++typedef struct _EXT_SWAPTARGETDEVICE ++{ ++ EXT_DEVICEDATAENTRY CurrentExistDevice; ++ EXT_DEVICEDATAENTRY NewDevice; ++} EXT_SWAPTARGETDEVICE, *PEXT_SWAPTARGETDEVICE; ++ ++/* LUN BitMask structure definition, array of 8bit bytes, ++ * 1 bit per lun. When bit == 1, the lun is masked. ++ * Most significant bit of mask[0] is lun 0. ++ * Least significant bit of mask[0] is lun 7. ++ */ ++typedef struct _EXT_LUN_BIT_MASK { ++#if ((EXT_DEF_MAX_LUN & 0x7) == 0) ++ UINT8 mask[EXT_DEF_MAX_LUN >> 3]; ++#else ++ UINT8 mask[(EXT_DEF_MAX_LUN + 8) >> 3 ]; ++#endif ++} EXT_LUN_BIT_MASK, *PEXT_LUN_BIT_MASK; ++ ++/* ++ * LUN mask bit manipulation macros ++ * ++ * P = Pointer to an EXT_LUN_BIT_MASK union. ++ * L = LUN number. ++ */ ++#define EXT_IS_LUN_BIT_SET(P,L) \ ++ (((P)->mask[L/8] & (0x80 >> (L%8)))?1:0) ++ ++#define EXT_SET_LUN_BIT(P,L) \ ++ ((P)->mask[L/8] |= (0x80 >> (L%8))) ++ ++#define EXT_CLR_LUN_BIT(P,L) \ ++ ((P)->mask[L/8] &= ~(0x80 >> (L%8))) ++ ++#define EXT_DEF_LUN_BITMASK_LIST_MIN_ENTRIES 1 ++#define EXT_DEF_LUN_BITMASK_LIST_MAX_ENTRIES 256 ++ ++#ifdef _WIN64 ++#define EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE 32 ++#else ++#define EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE \ ++ offsetof(LUN_BITMASK_LIST_BUFFER, asBitmaskEntry) ++#endif ++ ++#define EXT_DEF_LUN_COUNT 2048 ++#define EXT_DEF_LUN_BITMASK_BYTES (EXT_DEF_LUN_COUNT / 8) ++ ++typedef struct _EXT_LUN_BITMASK_ENTRY ++{ ++ UINT8 NodeName[EXT_DEF_WWN_NAME_SIZE]; ++ UINT8 PortName[EXT_DEF_WWN_NAME_SIZE]; ++ ++ UINT32 Reserved2; ++ UINT32 Reserved3; ++ UINT32 Reserved4; ++ UINT32 Reserved5; /* Pad to 32-byte header.*/ ++ ++ UINT8 Bitmask[EXT_DEF_LUN_BITMASK_BYTES]; ++} EXT_LUN_BITMASK_ENTRY, *PEXT_LUN_BITMASK_ENTRY; ++ ++/* Structure as it is stored in the config file.*/ ++typedef struct _LUN_BITMASK_LIST ++{ ++ UINT16 Version; /* Should be LUN_BITMASK_REGISTRY_VERSION */ ++ UINT16 EntryCount; /* Count of variable entries following.*/ ++ UINT32 Reserved1; ++ UINT32 Reserved2; ++ UINT32 Reserved3; ++ UINT32 Reserved4; ++ UINT32 Reserved5; ++ UINT32 Reserved6; ++ UINT32 Reserved7; /* Pad to 32-byte header.*/ ++ ++ EXT_LUN_BITMASK_ENTRY BitmaskEntry[1]; /* Variable-length data.*/ ++ ++} EXT_LUN_BITMASK_LIST, *PEXT_LUN_BITMASK_LIST; ++ ++ ++#define EXT_DEF_LUN_BITMASK_LIST_MIN_SIZE \ ++ (EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE + \ ++ (sizeof(EXT_DEF_LUN_BITMASK_ENTRY) * EXT_DEF_LUN_BITMASK_LIST_MIN_ENTRIES)) ++#define EXT_DEF_LUN_BITMASK_LIST_MAX_SIZE \ ++ (EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE + \ ++ (sizeof(EXT_DEF_LUN_BITMASK_ENTRY) * EXT_DEF_LUN_BITMASK_LIST_MAX_ENTRIES)) ++ ++/* Request Buffer for ELS PT*/ ++#define EXT_DEF_WWPN_VALID 1 ++#define EXT_DEF_WWNN_VALID 2 ++#define EXT_DEF_PID_VALID 4 ++typedef struct _EXT_ELS_PT_REQ { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ UINT16 ValidMask; /* 2 */ ++ UINT16 Lid; /* 2 */ ++ UINT16 Rxid; /* 2 */ ++ UINT16 AccRjt; /* 2 */ ++ UINT32 Reserved; /* 4 */ ++} EXT_ELS_PT_REQ, *PEXT_ELS_PT_REQ; /* 32 */ ++ ++#ifdef _MSC_VER ++#pragma pack() ++#endif ++ ++#endif /* _EXIOCT_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/exioctln.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,255 @@ ++/***************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 QLogic Corporation ++* (www.qlogic.com) ++* ++* 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. ++****************************************************************************/ ++ ++/* ++ * File Name: exioctln.h ++ ++ Rev 14 February 25, 2003 RL ++ - Added EXT_CC_DRIVER_SPECIFIC ioctl command to return ++ some driver specific data that can be used by API library ++ to determine how to maintain backward compatibility ++ of certain features. ++ ++ Rev 13 January 31, 2003 RL ++ - Changed the value of EXT_DEF_USE_HBASELECT to avoid ++ conflicting with older implementation of FO API lib. ++ ++ Rev 12 January 20, 2003 RL ++ - Added EXT_DEF_USE_HBASELECT definition for use by ++ the SETINSTANCE command. ++ ++ Rev 11 December 10, 2002 RL ++ - Added EXT_CC_SEND_ELS_PASSTHRU_OS definition. ++ ++ Rev 10 October 26, 2001 RL ++ - Corrected MAX_HBA, MAX_TARGET and MAX_LUN values to 255. ++ ++ Rev 9 July 26, 2001 RL ++ - Added definition of signed types. ++ ++ Rev 8 July 05, 2001 RL ++ - Redefined ioctl command values. ++ ++ Rev 7 Nov 06, 2000 BN ++ - Added EXT_DEF_MAX_AEN_QUEUE_OS define ++ - Added define for handle_hba_t ++ ++ Rev 6 Oct 25, 2000 BN ++ - Added EXT_CC_DRIVER_PROP_OS define ++ ++ Rev 5 Oct 25, 2000 BN ++ - Redo the copyright header and add AEN details ++ ++ Rev 4 Oct 23, 2000 BN ++ - Added definition for BOOLEAN ++ ++ Rev 3 Oct 23, 2000 BN ++ - Added definitions for EXT_ADDR_MODE_OS ++ and also include of <linux/ioctl.h> ++ ++ Rev 2 Oct 18, 2000 BN ++ - Enable API Exention support ++ ++ Rev 1 Original version Sep 7, 2000 BN ++ ++*/ ++ ++ ++#ifndef _EXIOCT_LN_H_ ++#define _EXIOCT_LN_H_ ++ ++#include <linux/ioctl.h> ++ ++#ifdef APILIB ++#include <stdint.h> ++#endif ++ ++ ++#define INT8 int8_t ++#define INT16 int16_t ++#define INT32 int32_t ++#define UINT8 uint8_t ++#define UINT16 uint16_t ++#define UINT32 uint32_t ++#define UINT64 void * ++#define BOOLEAN uint8_t ++ ++typedef struct track_instance { ++ int handle; ++} track_instance_t; ++ ++ ++#if BITS_PER_LONG <= 32 ++#define EXT_ADDR_MODE_OS EXT_DEF_ADDR_MODE_32 ++#else ++#define EXT_ADDR_MODE_OS EXT_DEF_ADDR_MODE_64 ++#endif ++ ++ ++#define QLMULTIPATH_MAGIC 'y' ++ ++#define _QLBUILD /* for exioct.h to enable include of qinsdmgt.h */ ++ ++ ++ ++#define EXT_DEF_MAX_HBA_OS 255 /* 0 - 0xFE */ ++#define EXT_DEF_MAX_BUS_OS 1 ++#define EXT_DEF_MAX_TARGET_OS 255 /* 0 - 0xFE */ ++#define EXT_DEF_MAX_LUN_OS 255 /* 0 - 0xFE */ ++ ++#define EXT_DEF_MAX_AEN_QUEUE_OS 64 ++ ++#define EXT_DEF_FC_HEADER_LEN 24 ++#define EXT_DEF_ELS_RJT_LENGTH 0x08 /* 8 */ ++#define EXT_DEF_ELS_RPS_ACC_LENGTH 0x40 /* 64 */ ++#define EXT_DEF_ELS_RLS_ACC_LENGTH 0x1C /* 28 */ ++ ++#define EXT_DEF_USE_HBASELECT 0x02 /* bit 1: HbaSelect field now ++ * used to specify destination ++ * HBA of each command. ++ * SetInstance cmd is now ++ * issued only once during ++ * API initialization. ++ */ ++ ++ ++/*****************/ ++/* Command codes */ ++/*****************/ ++ ++/*************************************************************/ ++/* These are regular/external command codes, starting from 0 */ ++/*************************************************************/ ++#define EXT_CC_QUERY_OS /* QUERY */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x00, sizeof(EXT_IOCTL)) ++#define EXT_CC_SEND_FCCT_PASSTHRU_OS /* FCCT_PASSTHRU */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x01, sizeof(EXT_IOCTL)) ++#define EXT_CC_REG_AEN_OS /* REG_AEN */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x02, sizeof(EXT_IOCTL)) ++#define EXT_CC_GET_AEN_OS /* GET_AEN */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x03, sizeof(EXT_IOCTL)) ++#define EXT_CC_SEND_ELS_RNID_OS /* SEND_ELS_RNID */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x04, sizeof(EXT_IOCTL)) ++#define EXT_CC_SCSI_PASSTHRU_OS /* SCSI_PASSTHRU */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x05, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_GET_DATA_OS /* GET_DATA */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x06, sizeof(EXT_IOCTL)) ++#define EXT_CC_SET_DATA_OS /* SET_DATA */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x07, sizeof(EXT_IOCTL)) ++ ++/*****************************************/ ++/* following are internal command codes. */ ++/*****************************************/ ++#define EXT_CC_RESERVED0A_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x08, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0B_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x09, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0C_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0a, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0D_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0b, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0E_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0c, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0F_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0d, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0G_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0e, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0H_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0f, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0I_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x10, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0J_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x11, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0Z_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x21, sizeof(EXT_IOCTL)) ++ ++/********************************************************/ ++/* These are additional regular/external command codes. */ ++/********************************************************/ ++#define EXT_CC_SEND_ELS_PASSTHRU_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x30, sizeof(EXT_IOCTL)) ++ ++ ++/********************************************************/ ++/* Failover ioctl command codes range from 0xc0 to 0xdf */ ++/********************************************************/ ++ ++ ++/*******************************************************************/ ++/* These are Linux driver implementation specific commands. Values */ ++/* start from highest possible value and in decreasing order. */ ++/*******************************************************************/ ++ ++#define EXT_CC_STARTIOCTL /* STARTIOCTL */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xff, sizeof(EXT_IOCTL)) ++#define EXT_CC_SETINSTANCE /* SETINSTANCE */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xfe, sizeof(EXT_IOCTL)) ++#define EXT_CC_WWPN_TO_SCSIADDR /* WWPN_TO_SCSIADDR */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xfd, sizeof(EXT_IOCTL)) ++#define EXT_CC_DRIVER_SPECIFIC /* DRIVER_SPECIFIC */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xfc, sizeof(EXT_IOCTL)) ++ ++ ++/* ++ * Response struct definition ++ */ ++typedef struct _EXT_LN_DRV_VERSION { ++ UINT8 Major; ++ UINT8 Minor; ++ UINT8 Patch; ++ UINT8 Beta; ++ UINT8 Reserved[4]; ++} EXT_LN_DRV_VERSION; /* 8 */ ++ ++typedef struct _EXT_LN_DRIVER_DATA { ++ EXT_LN_DRV_VERSION DrvVer; /* 8 */ ++ UINT32 Reserved[14]; /* 56 */ ++} EXT_LN_DRIVER_DATA, *PEXT_LN_DRIVER_DATA; /* 64 */ ++ ++ ++ ++ ++ ++ ++/* ++ * Overrides for Emacs so that we almost follow Linus's tabbing style. ++ * Emacs will notice this stuff at the end of the file and automatically ++ * adjust the settings for this buffer only. This must remain at the end ++ * of the file. ++ * --------------------------------------------------------------------------- ++ * Local variables: ++ * c-indent-level: 2 ++ * c-brace-imaginary-offset: 0 ++ * c-brace-offset: -2 ++ * c-argdecl-indent: 2 ++ * c-label-offset: -2 ++ * c-continued-statement-offset: 4 ++ * c-continued-brace-offset: 0 ++ * indent-tabs-mode: nil ++ * tab-width: 8 ++ * End: ++ */ ++ ++#endif /* _EXIOCT_LN_H_ */ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/inioct.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,129 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * File Name: inioct.h ++ * ++ * San/Device Management Ioctl Header ++ * File is created to adhere to Solaris requirement using 8-space tabs. ++ * ++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!! ++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!! ++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!! ++ * ++ * ++ * Revision History: ++ * ++ * Rev. 0 June 15, 2001 ++ * YPL - Created. ++ * ++ * Rev. 1 June 26, 2001 ++ * YPL - Change the loop back structure and delete cc that is not used. ++ * ++ * Rev. 2 June 29, 2001 ++ * YPL - Use new EXT_CC defines from exioct.h ++ * ++ * Rev. 3 July 12, 2001 ++ * RL - Added definitions for loopback mbx command completion codes. ++ * ++ * Rev. 4 July 12, 2001 ++ * RL - Added definitions for loopback mbx command completion codes. ++ * ++ * Rev. 5 October 9, 2002 ++ * AV - Added definition for Read Option ROM IOCTL. ++ * ++ */ ++ ++#ifndef _INIOCT_H ++#define _INIOCT_H ++ ++/* ++ * *********************************************************************** ++ * X OS type definitions ++ * *********************************************************************** ++ */ ++#ifdef _MSC_VER /* NT */ ++#pragma pack(1) ++#endif ++ ++/* ++ * *********************************************************************** ++ * INT_IOCTL SubCode definition. ++ * These macros are being used for setting SubCode field in EXT_IOCTL ++ * structure. ++ * *********************************************************************** ++ */ ++ ++/* ++ * Currently supported DeviceControl / ioctl command codes ++ */ ++#define INT_CC_GET_PORT_STAT_FC EXT_CC_RESERVED0A_OS ++#define INT_CC_LOOPBACK EXT_CC_RESERVED0B_OS ++#define INT_CC_UPDATE_OPTION_ROM EXT_CC_RESERVED0C_OS ++#define INT_CC_ADD_TARGET_DEVICE EXT_CC_RESERVED0D_OS ++#define INT_CC_READ_NVRAM EXT_CC_RESERVED0E_OS ++#define INT_CC_UPDATE_NVRAM EXT_CC_RESERVED0F_OS ++#define INT_CC_SWAP_TARGET_DEVICE EXT_CC_RESERVED0G_OS ++#define INT_CC_READ_OPTION_ROM EXT_CC_RESERVED0H_OS ++#define INT_CC_LEGACY_LOOPBACK EXT_CC_RESERVED0Z_OS ++ ++ ++ ++/* NVRAM */ ++#define INT_SC_NVRAM_HARDWARE 0 /* Save */ ++#define INT_SC_NVRAM_DRIVER 1 /* Driver (Apply) */ ++#define INT_SC_NVRAM_ALL 2 /* NVRAM/Driver (Save+Apply) */ ++ ++/* Loopback */ ++typedef struct _INT_LOOPBACK_REQ ++{ ++ UINT16 Options; /* 2 */ ++ UINT32 TransferCount; /* 4 */ ++ UINT32 IterationCount; /* 4 */ ++ UINT64 BufferAddress; /* 8 */ ++ UINT32 BufferLength; /* 4 */ ++ UINT16 Reserved[9]; /* 18 */ ++} ++INT_LOOPBACK_REQ, *PINT_LOOPBACK_REQ; /* 408 */ ++ ++typedef struct _INT_LOOPBACK_RSP ++{ ++ UINT64 BufferAddress; /* 8 */ ++ UINT32 BufferLength; /* 4 */ ++ UINT16 CompletionStatus; /* 2 */ ++ UINT16 CrcErrorCount; /* 2 */ ++ UINT16 DisparityErrorCount; /* 2 */ ++ UINT16 FrameLengthErrorCount; /* 2 */ ++ UINT32 IterationCountLastError; /* 4 */ ++ UINT16 Reserved[8]; /* 16 */ ++} ++INT_LOOPBACK_RSP, *PINT_LOOPBACK_RSP; /* 40 */ ++ ++/* definition for interpreting CompletionStatus values */ ++#define INT_DEF_LB_COMPLETE 0x4000 ++#define INT_DEF_LB_PARAM_ERR 0x4006 ++#define INT_DEF_LB_LOOP_DOWN 0x400b ++#define INT_DEF_LB_CMD_ERROR 0x400c ++ ++ ++#ifdef _MSC_VER ++#pragma pack() ++#endif ++ ++#endif /* _INIOCT_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2100tp_fw.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,4866 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ *************************************************************************/ ++ ++/************************************************************************ ++ * * ++ * --- ISP2100 Fabric Initiator/Target Firmware --- * ++ * with expanded LUN addressing * ++ * and FcTape (FCP-2) support * ++ * * ++ * * ++ ************************************************************************/ ++/* ++ * Firmware Version 1.19.24 (14:02 Jul 16, 2002) ++ */ ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_version = 1*1024+19; ++#else ++unsigned short risc_code_version = 1*1024+19; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned char fw2100tp_version_str[] = {1,19,24}; ++#else ++unsigned char firmware_version[] = {1,19,24}; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++#define fw2100tp_VERSION_STRING "1.19.24" ++#else ++#define FW_VERSION_STRING "1.19.24" ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_addr01 = 0x1000 ; ++#else ++unsigned short risc_code_addr01 = 0x1000 ; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_code01[] = { ++#else ++unsigned short risc_code01[] = { ++#endif ++ 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 ++}; ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_length01 = 0x95f1; ++#else ++unsigned short risc_code_length01 = 0x95f1; ++#endif ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2200ip_fw.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,5884 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ *************************************************************************/ ++ ++/************************************************************************ ++ * * ++ * -- ISP2200 Initiator/Target Firmware --- * ++ * IP and SCSI, Fabric (Public Loop), Point-point, and * ++ * expanded LUN addressing for FCTAPE * ++ * * ++ ************************************************************************/ ++ ++/* ++ * Firmware Version 2.02.05 (13:47 Apr 25, 2003) ++ */ ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_version = 2*1024+2; ++#else ++unsigned short risc_code_version = 2*1024+2; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned char fw2200ip_version_str[] = {2,2,5}; ++#else ++unsigned char firmware_version[] = {2,2,5}; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++#define fw2200ip_VERSION_STRING "2.02.05" ++#else ++#define FW_VERSION_STRING "2.02.05" ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_addr01 = 0x1000 ; ++#else ++unsigned short risc_code_addr01 = 0x1000 ; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_code01[] = { ++#else ++unsigned short risc_code01[] = { ++#endif ++ 0x0470, 0x0000, 0x0000, 0xb5c6, 0x0000, 0x0002, 0x0002, 0x0005, ++ 0x0037, 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, 0x3520, 0x2020, 0x2020, 0x2400, 0x20c1, ++ 0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xcbff, 0x2091, ++ 0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x2b14, ++ 0x2051, 0xc600, 0x2a70, 0x2029, 0xfe00, 0x2031, 0xffff, 0x2039, ++ 0xfde9, 0x2021, 0x0200, 0x0804, 0x146c, 0x20a1, 0xc5c6, 0xa00e, ++ 0x20a9, 0x083a, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a, ++ 0x746e, 0x20a1, 0xce00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d, ++ 0xa18c, 0x000f, 0x2001, 0x000c, 0xa112, 0xa00e, 0x21a8, 0x41a4, ++ 0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218, ++ 0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xc600, ++ 0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001, ++ 0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0, ++ 0x2009, 0xc600, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e, ++ 0x41a4, 0x080c, 0x1415, 0x080c, 0x163c, 0x080c, 0x17de, 0x080c, ++ 0x2061, 0x080c, 0x4f3b, 0x080c, 0x9585, 0x080c, 0x15bf, 0x080c, ++ 0x306e, 0x080c, 0x61dd, 0x080c, 0x5743, 0x080c, 0x7147, 0x080c, ++ 0x6edf, 0x080c, 0x265b, 0x080c, 0x7860, 0x080c, 0x68c0, 0x080c, ++ 0x2515, 0x080c, 0x2629, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, ++ 0x10c7, 0x7820, 0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, ++ 0x10bf, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, ++ 0x7003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003, 0x1168, 0x080c, ++ 0x40b9, 0x080c, 0x3095, 0x080c, 0x622b, 0x080c, 0x5943, 0x080c, ++ 0x7184, 0x080c, 0x6f0a, 0x0c70, 0x000b, 0x0c88, 0x10e8, 0x10e9, ++ 0x1214, 0x10e6, 0x12e1, 0x1412, 0x1413, 0x1414, 0x080c, 0x1519, ++ 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0xa086, 0x0001, ++ 0x1904, 0x11f1, 0x080c, 0x158c, 0x080c, 0x5f22, 0x0150, 0x080c, ++ 0x5f48, 0x15c0, 0x2079, 0x0100, 0x7828, 0xa085, 0x1800, 0x782a, ++ 0x0488, 0x080c, 0x5e5a, 0x7000, 0xa086, 0x0001, 0x1904, 0x11f1, ++ 0x708c, 0xa086, 0x0028, 0x1904, 0x11f1, 0x2001, 0x0161, 0x2003, ++ 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0xa295, 0x1e2f, ++ 0x7a2a, 0x2011, 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, 0x080c, ++ 0x7070, 0x2011, 0x5e37, 0x080c, 0x6fad, 0x2011, 0x4e18, 0x080c, ++ 0x6fad, 0x2011, 0x8030, 0x2019, 0x0000, 0x708b, 0x0000, 0x080c, ++ 0x1eae, 0x00e8, 0x080c, 0x47cb, 0x2079, 0x0100, 0x7844, 0xa005, ++ 0x1904, 0x11f1, 0x2011, 0x4e18, 0x080c, 0x6fad, 0x2011, 0x5e37, ++ 0x080c, 0x6fad, 0x080c, 0x1eae, 0x2001, 0xc8d4, 0x2004, 0x780e, ++ 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010, 0x73cc, 0x080c, ++ 0x407d, 0x723c, 0xc284, 0x723e, 0x2001, 0xc60c, 0x200c, 0xc1ac, ++ 0x2102, 0x080c, 0x8dca, 0x2011, 0x0004, 0x080c, 0xac97, 0x080c, ++ 0x55e1, 0x080c, 0x5f22, 0x0158, 0x080c, 0x4f24, 0x0140, 0x708b, ++ 0x0001, 0x70c7, 0x0000, 0x080c, 0x4968, 0x0804, 0x11f1, 0x080c, ++ 0x570b, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x0060, 0x7073, 0x0000, ++ 0x080c, 0xb03f, 0x70d4, 0xd09c, 0x1128, 0x70a0, 0xa005, 0x0110, ++ 0x080c, 0x4f02, 0x70df, 0x0000, 0x70db, 0x0000, 0x72d4, 0x080c, ++ 0x5f22, 0x1178, 0x2011, 0x0000, 0x0016, 0x080c, 0x2a95, 0x2019, ++ 0xc8d6, 0x211a, 0x001e, 0x7053, 0xffff, 0x7057, 0x00ef, 0x7077, ++ 0x0000, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72d6, ++ 0x080c, 0x5f22, 0x0118, 0xa296, 0x0004, 0x0548, 0x2011, 0x0001, ++ 0x080c, 0xac97, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, 0x0002, ++ 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a, ++ 0x00fe, 0x080c, 0x2c62, 0x2011, 0x0005, 0x080c, 0x8f0e, 0x080c, ++ 0x7e94, 0x080c, 0x5f22, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, ++ 0x080c, 0x2a95, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x709b, ++ 0x0000, 0x709f, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, ++ 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, 0x2011, ++ 0x0005, 0x080c, 0x8f0e, 0x080c, 0x7e94, 0x080c, 0x5f22, 0x0148, ++ 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2a95, 0x61e2, 0x001e, ++ 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f22, 0x1118, ++ 0x20a9, 0x0100, 0x0010, 0x20a9, 0x0082, 0x080c, 0x5f22, 0x1118, ++ 0x2009, 0x0000, 0x0010, 0x2009, 0x007e, 0x080c, 0x2f41, 0x8108, ++ 0x1f04, 0x1205, 0x00ce, 0x7073, 0x0000, 0x7074, 0xa084, 0x00ff, ++ 0x7076, 0x70a3, 0x0000, 0x0005, 0x0126, 0x2091, 0x8000, 0x7000, ++ 0xa086, 0x0002, 0x1904, 0x12df, 0x709c, 0xa086, 0xffff, 0x0130, ++ 0x080c, 0x2c62, 0x080c, 0x7e94, 0x0804, 0x12df, 0x70d4, 0xd0ac, ++ 0x1110, 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x0016, 0x2001, ++ 0x0103, 0x2009, 0xc8d4, 0x210c, 0x2102, 0x001e, 0x000e, 0xd08c, ++ 0x01d0, 0x70d8, 0xa086, 0xffff, 0x0190, 0x080c, 0x2dc1, 0x080c, ++ 0x7e94, 0x70d4, 0xd094, 0x1904, 0x12df, 0x2011, 0x0001, 0x2019, ++ 0x0000, 0x080c, 0x2df9, 0x080c, 0x7e94, 0x0804, 0x12df, 0x70dc, ++ 0xa005, 0x1904, 0x12df, 0x7098, 0xa005, 0x1904, 0x12df, 0x70d4, ++ 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x12df, 0x080c, 0x570b, 0x1904, ++ 0x12df, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x01c8, 0x0156, 0x00c6, ++ 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1118, ++ 0x6000, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x126c, 0x00ce, ++ 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x12df, 0x0006, ++ 0x0016, 0x2001, 0x0103, 0x2009, 0xc8d4, 0x210c, 0x2102, 0x001e, ++ 0x000e, 0x71a8, 0x81ff, 0x11b0, 0xa006, 0x2009, 0x0200, 0x20a9, ++ 0x0002, 0x20a1, 0xc925, 0x40a1, 0x2009, 0x0700, 0x20a9, 0x0002, ++ 0x20a1, 0xc915, 0x40a1, 0x7070, 0x8007, 0x7174, 0x810f, 0x20a9, ++ 0x0002, 0x40a1, 0x20a1, 0xc919, 0x2009, 0x0000, 0x080c, 0x14ff, ++ 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x40a1, 0x7030, 0xc08c, ++ 0x7032, 0x7003, 0x0003, 0x709f, 0xffff, 0x080c, 0x1585, 0xa006, ++ 0x080c, 0x296d, 0x080c, 0x40ef, 0x00f6, 0x2079, 0x0100, 0x080c, ++ 0x5f48, 0x0150, 0x080c, 0x5f22, 0x7828, 0x0118, 0xa084, 0xe1ff, ++ 0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0xc928, 0x2004, ++ 0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8f0e, 0x2011, ++ 0x0000, 0x080c, 0x8f18, 0x080c, 0x7e94, 0x080c, 0x7f6e, 0x012e, ++ 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, ++ 0x0100, 0x2009, 0xc634, 0x2104, 0xa005, 0x1110, 0x080c, 0x2ac1, ++ 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x7940, 0xa18c, 0x0010, 0x7942, ++ 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, ++ 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x134f, ++ 0x080c, 0x5f34, 0x0158, 0x080c, 0x5f48, 0x1128, 0x2001, 0xc8e5, ++ 0x2003, 0x0000, 0x0070, 0x080c, 0x5f2a, 0x0dc0, 0x2001, 0xc8e5, ++ 0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e5a, ++ 0x0058, 0x080c, 0x5f22, 0x0140, 0x2009, 0x00f8, 0x080c, 0x4eeb, ++ 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, ++ 0x1138, 0x080c, 0x5f22, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f9, ++ 0x1f04, 0x132e, 0x0070, 0x7824, 0x080c, 0x5f3e, 0x0118, 0xd0ac, ++ 0x1904, 0x13f9, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, ++ 0x13f9, 0x2001, 0x0001, 0x080c, 0x296d, 0x0804, 0x1408, 0x7850, ++ 0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0046, 0x1d04, ++ 0x1357, 0x080c, 0x7058, 0x1f04, 0x1357, 0x7850, 0xa084, 0x0180, ++ 0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5f34, 0x0158, ++ 0x080c, 0x5f48, 0x1128, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x0070, ++ 0x080c, 0x5f2a, 0x0dc0, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001, ++ 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e5a, 0x0020, 0x2009, 0x00f8, ++ 0x080c, 0x4eeb, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x1384, 0x7850, ++ 0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5f22, 0x0120, ++ 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, ++ 0x7820, 0xd09c, 0x1558, 0x080c, 0x5f22, 0x05d8, 0x7824, 0xd0ac, ++ 0x1904, 0x13f9, 0x080c, 0x5f48, 0x1508, 0x0046, 0x2021, 0x0190, ++ 0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, 0x20a9, ++ 0x01f4, 0x1d04, 0x13b1, 0x080c, 0x7058, 0x1f04, 0x13b1, 0x7824, ++ 0xa084, 0x0068, 0x15c8, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001, ++ 0xc8e6, 0x2003, 0x0001, 0x7003, 0x0001, 0x0498, 0x1d04, 0x13ca, ++ 0x080c, 0x7058, 0x8319, 0x1960, 0x2009, 0xc634, 0x2104, 0x8000, ++ 0x200a, 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, 0x2ac1, ++ 0x00d8, 0x080c, 0x5f34, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c, ++ 0x5ef9, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000, ++ 0x7824, 0x080c, 0x5f3e, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800, ++ 0x09a8, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x296d, ++ 0x0048, 0x2001, 0xc634, 0x2003, 0x0000, 0x7827, 0x0048, 0x7828, ++ 0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852, ++ 0x015e, 0x003e, 0x000e, 0x080c, 0x155c, 0x012e, 0x00fe, 0x004e, ++ 0x001e, 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2061, 0xc908, ++ 0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0005, 0x600f, 0x0037, ++ 0x2001, 0xc8e5, 0x2003, 0x0000, 0x708b, 0x0000, 0x2009, 0x0100, ++ 0x2104, 0xa082, 0x0002, 0x0218, 0x7053, 0xffff, 0x0010, 0x7053, ++ 0x0000, 0x705b, 0xffff, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c, ++ 0xb03f, 0x2061, 0xc8d5, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, ++ 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x601b, ++ 0x0000, 0x601f, 0x07d0, 0x2061, 0xc8dd, 0x6003, 0x8000, 0x6007, ++ 0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, ++ 0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061, 0xc900, 0x6003, ++ 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, ++ 0xc628, 0x2003, 0x0000, 0x0005, 0x04a0, 0x2011, 0x0000, 0x81ff, ++ 0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039, 0xe601, ++ 0x2021, 0x0100, 0x2029, 0xe600, 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, 0x14a8, 0x0804, 0x14f9, ++ 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000, ++ 0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011, 0x0000, ++ 0x2019, 0x14bb, 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, 0x14d6, 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, 0x14f7, 0x0010, 0x0804, ++ 0x146d, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837, 0x2011, ++ 0x0000, 0x080c, 0x533d, 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, 0x151b, 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, ++ 0xca54, 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, 0xc600, 0x7803, 0x0005, 0x2091, ++ 0x4080, 0x04c9, 0x0cf8, 0x0005, 0x0006, 0x080c, 0x15a7, 0x1518, ++ 0x00f6, 0x2079, 0xc624, 0x2f04, 0x8000, 0x207a, 0xa082, 0x000f, ++ 0x0258, 0xa006, 0x207a, 0x2079, 0xc626, 0x2f04, 0xa084, 0x0001, ++ 0xa086, 0x0001, 0x207a, 0x0070, 0x2079, 0xc626, 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, 0x15b6, ++ 0x2091, 0x6000, 0x1f04, 0x15b6, 0x012e, 0x015e, 0x0005, 0x2071, ++ 0xc600, 0x7160, 0x712e, 0x2021, 0x0001, 0xa190, 0x0030, 0xa298, ++ 0x0030, 0x0240, 0x7064, 0xa302, 0x1228, 0x220a, 0x2208, 0x2310, ++ 0x8420, 0x0ca8, 0x3800, 0xd08c, 0x0148, 0x7064, 0xa086, 0xc600, ++ 0x0128, 0x7067, 0xc600, 0x2011, 0x1000, 0x0c48, 0x200b, 0x0000, ++ 0x74b2, 0x74b6, 0x70eb, 0x0010, 0x0005, 0x00e6, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0xc600, 0x70b4, 0x0016, 0x2008, 0x70e8, 0xa16a, ++ 0x2100, 0x001e, 0x0268, 0x8001, 0x70b6, 0x702c, 0x2068, 0x2d04, ++ 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, ++ 0xa06e, 0x0cd8, 0x00e6, 0x2071, 0xc600, 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, 0xc600, 0x702c, ++ 0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, 0x70b6, 0x012e, 0x00ee, ++ 0x0005, 0x8dff, 0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49, ++ 0x00de, 0x0cb8, 0x0005, 0x00e6, 0x2071, 0xc600, 0x70b4, 0xa08a, ++ 0x0010, 0xa00d, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xc959, 0x7007, ++ 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, ++ 0xa085, 0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x00e6, 0x2270, 0x700b, 0x0000, 0x2071, 0xc959, 0x7018, 0xa088, ++ 0xc962, 0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, ++ 0x1128, 0x00f6, 0x2079, 0x0010, 0x0089, 0x00fe, 0x00ee, 0x012e, ++ 0x0005, 0x00e6, 0x2071, 0xc959, 0x7004, 0xa005, 0x1128, 0x00f6, ++ 0x2079, 0x0010, 0x0019, 0x00fe, 0x00ee, 0x0005, 0x7000, 0x0002, ++ 0x1680, 0x16e4, 0x1701, 0x1701, 0x23e7, 0x16e4, 0x1701, 0x16e4, ++ 0x7018, 0x711c, 0xa106, 0x1118, 0x7007, 0x0000, 0x0005, 0x00d6, ++ 0xa180, 0xc962, 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, ++ 0xc71a, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, ++ 0x0126, 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, ++ 0xc084, 0x7002, 0x700b, 0xc715, 0x012e, 0x015e, 0x014e, 0x013e, ++ 0x0005, 0x0136, 0x0146, 0x0156, 0x2001, 0xc749, 0x209c, 0x20a1, ++ 0x0014, 0x7803, 0x0026, 0x2001, 0xc74a, 0x20ac, 0x53a6, 0x2099, ++ 0xc74b, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, ++ 0x0126, 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, ++ 0xc08c, 0x7002, 0x700b, 0xc746, 0x012e, 0x015e, 0x014e, 0x013e, ++ 0x0005, 0x0016, 0x00e6, 0x2071, 0xc959, 0x00f6, 0x2079, 0x0010, ++ 0x7904, 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c, 0x0700, 0x7004, ++ 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1676, 0x1745, 0x1773, ++ 0x179d, 0x17cd, 0x2404, 0x1744, 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, 0x16ab, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, ++ 0x7007, 0x0000, 0x080c, 0x1676, 0x0005, 0x7008, 0xa080, 0x0002, ++ 0x2003, 0x0200, 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c, 0xa005, ++ 0x0188, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x16c0, 0x0005, ++ 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x080c, ++ 0x1676, 0x0005, 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834, ++ 0x682a, 0x7838, 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x00de, ++ 0x7007, 0x0000, 0x080c, 0x1676, 0x0005, 0xa18c, 0x0700, 0x1540, ++ 0x0136, 0x0146, 0x0156, 0x2001, 0xc718, 0x2004, 0xa080, 0x000d, ++ 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, ++ 0x2001, 0xc71a, 0x2004, 0xd0bc, 0x0148, 0x2001, 0xc723, 0x2004, ++ 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e, 0x014e, ++ 0x013e, 0x7007, 0x0000, 0x080c, 0x62c2, 0x080c, 0x1676, 0x0005, ++ 0x2011, 0x8003, 0x080c, 0x407d, 0x0cf8, 0xa18c, 0x0700, 0x1148, ++ 0x2001, 0xc748, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, 0x1676, ++ 0x0005, 0x2011, 0x8004, 0x080c, 0x407d, 0x0cf8, 0x0126, 0x2091, ++ 0x2200, 0x2079, 0x0030, 0x2071, 0xc96a, 0x7003, 0x0000, 0x700f, ++ 0xc977, 0x7013, 0xc977, 0x780f, 0x00f6, 0x7803, 0x0004, 0x012e, ++ 0x0005, 0x6934, 0xa184, 0x0007, 0x0002, 0x17fd, 0x183e, 0x17fd, ++ 0x17fd, 0x1801, 0x1826, 0x180d, 0x1804, 0xa085, 0x0001, 0x0804, ++ 0x1858, 0x080c, 0x7684, 0x05d0, 0x684c, 0xd0bc, 0x0db0, 0x6860, ++ 0x682e, 0x685c, 0x682a, 0x6858, 0x04c8, 0xa18c, 0x00ff, 0xa186, ++ 0x001e, 0x1d58, 0x684c, 0xd0bc, 0x0d40, 0x6860, 0x682e, 0x685c, ++ 0x682a, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, ++ 0xa080, 0x23c7, 0x2005, 0x6832, 0x6858, 0x0440, 0xa18c, 0x00ff, ++ 0xa186, 0x0015, 0x1990, 0x684c, 0xd0ac, 0x0978, 0x6804, 0x681a, ++ 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2005, ++ 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0080, 0x684c, 0xd0ac, ++ 0x0904, 0x17fd, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, 0x000f, ++ 0xa188, 0x23c7, 0x210d, 0x6932, 0x2d08, 0x691a, 0x6826, 0x684c, ++ 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, ++ 0x0005, 0x684c, 0xd0ac, 0x090c, 0x1519, 0x6833, 0x23c4, 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, 0x17f1, 0x0138, 0x00de, 0xa280, 0x0000, 0x2003, 0x0002, ++ 0xa016, 0x0020, 0x6808, 0x8000, 0x680a, 0x00de, 0x0126, 0x0046, ++ 0x0036, 0x0026, 0x2091, 0x2200, 0x002e, 0x003e, 0x004e, 0x7000, ++ 0xa005, 0x0178, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, ++ 0x8108, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, 0x710e, 0x012e, ++ 0x0005, 0x7206, 0x2001, 0x18af, 0x0006, 0x2260, 0x0804, 0x19d3, ++ 0x0126, 0x0026, 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200, 0x000e, ++ 0x004e, 0x003e, 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110, 0x2168, ++ 0x6a62, 0x6b5e, 0xa005, 0x0904, 0x1910, 0x6808, 0xa005, 0x0904, ++ 0x1947, 0x7000, 0xa005, 0x1108, 0x0488, 0x700c, 0x7110, 0xa106, ++ 0x1904, 0x194f, 0x7004, 0xa406, 0x1548, 0x2001, 0x0005, 0x2004, ++ 0xd08c, 0x0168, 0x0046, 0x080c, 0x1b83, 0x004e, 0x2460, 0x6010, ++ 0xa080, 0x0002, 0x2004, 0xa005, 0x0904, 0x1947, 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, 0x194f, 0x2009, 0x0048, 0x080c, 0x9613, 0x04f8, ++ 0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c, 0x7110, ++ 0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005, 0x2004, ++ 0xd08c, 0x0160, 0x0046, 0x080c, 0x1b83, 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, 0x9613, 0x00ce, ++ 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036, 0x0046, ++ 0x0056, 0x2071, 0xc96a, 0x7000, 0xa086, 0x0000, 0x0904, 0x19b9, ++ 0x7004, 0xac06, 0x1904, 0x19ab, 0x2079, 0x0030, 0x7000, 0xa086, ++ 0x0003, 0x0904, 0x19ab, 0x7804, 0xd0fc, 0x15c8, 0x20e1, 0x6000, ++ 0x2011, 0x0032, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, ++ 0xa106, 0x1d88, 0x8211, 0x1db0, 0x7804, 0xd0fc, 0x1540, 0x080c, ++ 0x1f2d, 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x1de8, ++ 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, 0x0000, ++ 0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c, 0x5f22, ++ 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0058, ++ 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0020, 0x080c, ++ 0x1b83, 0x0804, 0x195b, 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, ++ 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x19b0, ++ 0x015e, 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe, 0x0005, ++ 0x700c, 0x7110, 0xa106, 0x0904, 0x1a5c, 0x2104, 0x7006, 0x2060, ++ 0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xc992, 0x0210, ++ 0x2009, 0xc977, 0x7112, 0x8cff, 0x05e8, 0x6010, 0x2068, 0x2d58, ++ 0x080c, 0x7824, 0x6828, 0xa406, 0x15e0, 0x682c, 0xa306, 0x15c8, ++ 0x7004, 0x2060, 0x6020, 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128, ++ 0x6817, 0xffff, 0x6813, 0xffff, 0x0428, 0x6850, 0xd0f4, 0x1130, ++ 0x7803, 0x0004, 0x6810, 0x781a, 0x6814, 0x781e, 0x6824, 0x2050, ++ 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x080c, ++ 0x7684, 0x1128, 0x2009, 0x0011, 0x080c, 0x1a5f, 0x0048, 0x2009, ++ 0x0011, 0x080c, 0x1a5f, 0x0120, 0x2009, 0x0001, 0x080c, 0x1a5f, ++ 0x2d58, 0x0005, 0x7803, 0x0004, 0x080c, 0x1ea2, 0x0904, 0x19c0, ++ 0x0cc0, 0x080c, 0x7684, 0x1128, 0x080c, 0x1953, 0x080c, 0x761a, ++ 0x0c88, 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, 0xafd1, 0x0990, ++ 0x601c, 0xa08e, 0x0008, 0x0904, 0x19e0, 0xa08e, 0x000a, 0x0904, ++ 0x19e0, 0x2001, 0xc674, 0x2004, 0xd0b4, 0x1140, 0x6018, 0x2004, ++ 0xd0bc, 0x1120, 0x6817, 0x7fff, 0x6813, 0xffff, 0x080c, 0x241b, ++ 0x1904, 0x1a12, 0x0804, 0x19e0, 0x7003, 0x0000, 0x0005, 0x8aff, ++ 0x0904, 0x1b5d, 0xa03e, 0x2730, 0xc9fc, 0x6850, 0xd0fc, 0x11b8, ++ 0xd0f4, 0x1538, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x1acb, ++ 0x1a98, 0x1a98, 0x1acb, 0x1ace, 0x1ac3, 0x1acb, 0x1a98, 0x1acb, ++ 0x1aa9, 0x1aa9, 0x1acb, 0x1ace, 0x1acb, 0x1abb, 0x1aa9, 0x7803, ++ 0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x00d6, ++ 0xd99c, 0x0904, 0x1b1e, 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0804, ++ 0x1b1f, 0xc0f4, 0x6852, 0x6b6c, 0x6a70, 0x00d6, 0x0804, 0x1b2c, ++ 0x2d10, 0x00de, 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, 0xa096, ++ 0x0024, 0x0904, 0x1afe, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0804, ++ 0x1b1e, 0x2d10, 0x00de, 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, ++ 0xa096, 0x002c, 0x0540, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, ++ 0x6e0c, 0x0804, 0x1b1f, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, ++ 0xa086, 0x001e, 0x1140, 0x00de, 0x080c, 0x2389, 0x1904, 0x1a5f, ++ 0xa00e, 0x0804, 0x1b5d, 0x00de, 0x080c, 0x1519, 0x2d10, 0x00de, ++ 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, 0xa096, 0x0024, 0x0530, ++ 0xa096, 0x002c, 0x1d80, 0x6b10, 0xa3a6, 0xffff, 0x1130, 0x2d10, ++ 0x00de, 0x00d6, 0x080c, 0x72fa, 0x2268, 0x2d10, 0x00de, 0x00d6, ++ 0x7314, 0x685c, 0xa086, 0x0001, 0x1120, 0x6868, 0xa005, 0x0108, ++ 0x2018, 0x2268, 0x2011, 0x0000, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, ++ 0x780f, 0x00f0, 0xe000, 0xe000, 0xe000, 0x0408, 0x6b08, 0xa3a6, ++ 0xffff, 0x1130, 0x2d10, 0x00de, 0x00d6, 0x080c, 0x72fa, 0x2268, ++ 0x2d10, 0x00de, 0x00d6, 0x7314, 0x685c, 0xa086, 0x0001, 0x1120, ++ 0x6868, 0xa005, 0x0108, 0x2018, 0x2268, 0x2011, 0x0000, 0x6d00, ++ 0x6c04, 0x780f, 0x00f0, 0xe000, 0xe000, 0xe000, 0xc9fd, 0x7b22, ++ 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x731a, 0x721e, 0x7522, ++ 0x7426, 0x772a, 0x762e, 0x7902, 0x7100, 0x8108, 0x7102, 0x00de, ++ 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x8109, 0x2d08, ++ 0x1500, 0xd9fc, 0x0160, 0xc9fc, 0x080c, 0x2389, 0x01e8, 0x2805, ++ 0xac68, 0x6800, 0xa506, 0x11c0, 0x6804, 0xa406, 0x00a8, 0xc9fc, ++ 0x080c, 0x2389, 0x0188, 0x2805, 0xac68, 0x6800, 0xa506, 0x1160, ++ 0x6804, 0xa406, 0x1148, 0x6808, 0xa706, 0x1130, 0x680c, 0xa606, ++ 0x0018, 0xc9fc, 0x080c, 0x2389, 0x2168, 0x0005, 0x080c, 0x1519, ++ 0x080c, 0x2014, 0x7004, 0x2060, 0x00d6, 0x6010, 0x2068, 0x7003, ++ 0x0000, 0x080c, 0x1ec3, 0x080c, 0xac91, 0x0170, 0x6808, 0x8001, ++ 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, ++ 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0xa961, 0x0804, ++ 0x1dec, 0x080c, 0x1519, 0x0126, 0x2091, 0x2200, 0x0006, 0x0016, ++ 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, ++ 0x1978, 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58, 0x7000, 0x0002, ++ 0x1ba0, 0x1ba6, 0x1cf5, 0x1dc1, 0x1ddb, 0x1ba0, 0x1ba0, 0x1ba0, ++ 0x7804, 0xd09c, 0x1904, 0x1dec, 0x080c, 0x1519, 0x8001, 0x7002, ++ 0xd1bc, 0x15c0, 0x080c, 0x7684, 0x1508, 0xd1dc, 0x1598, 0x6864, ++ 0x8000, 0x6866, 0xd19c, 0x0140, 0x7004, 0x2060, 0x2009, 0x0102, ++ 0x080c, 0x9613, 0x0804, 0x1cbc, 0x8aff, 0x0130, 0x2009, 0x0001, ++ 0x080c, 0x1a5f, 0x0804, 0x1dec, 0x7004, 0x2060, 0x080c, 0x24e0, ++ 0x080c, 0x761a, 0x7007, 0x0000, 0x0804, 0x1c45, 0xd19c, 0x1904, ++ 0x1c79, 0xd1dc, 0x1178, 0x8aff, 0x0904, 0x1c79, 0x2009, 0x0001, ++ 0x080c, 0x1a5f, 0x0904, 0x1dec, 0x2009, 0x0001, 0x080c, 0x1a5f, ++ 0x0804, 0x1dec, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, ++ 0x1c4b, 0x080c, 0x7684, 0x1130, 0xd19c, 0x0120, 0x6864, 0x8000, ++ 0x6866, 0x0810, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34, ++ 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004, 0xa005, ++ 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003, 0x0004, ++ 0x0028, 0x080c, 0x7684, 0x0110, 0x080c, 0x1df0, 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, 0x239f, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826, 0x2c00, ++ 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x1148, 0x684c, ++ 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x9613, ++ 0x7000, 0xa086, 0x0004, 0x0904, 0x1dec, 0x7003, 0x0000, 0x080c, ++ 0x19c0, 0x0804, 0x1dec, 0x0056, 0x7d0c, 0xd5bc, 0x1110, 0x080c, ++ 0xc55e, 0x005e, 0x080c, 0x1ec3, 0x7004, 0x2060, 0x601c, 0xa086, ++ 0x0009, 0x1140, 0x2009, 0x0106, 0x080c, 0x9613, 0x7007, 0x0000, ++ 0x0804, 0x1dec, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118, ++ 0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, ++ 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, ++ 0x1dec, 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, 0x1be2, 0x684c, 0xc0f5, ++ 0x684e, 0x7814, 0xa005, 0x1520, 0x7003, 0x0000, 0x6808, 0x8001, ++ 0x680a, 0x01a0, 0x7004, 0x2060, 0x601c, 0xa086, 0x000a, 0x11a0, ++ 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, 0x2104, 0xac06, 0x1108, ++ 0x200a, 0xa188, 0x0003, 0x1f04, 0x1cad, 0x015e, 0x7004, 0x2060, ++ 0x2009, 0x0048, 0x080c, 0x9613, 0x080c, 0x19c0, 0x0804, 0x1dec, ++ 0x7818, 0x6812, 0x781c, 0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, ++ 0xa192, 0x0841, 0x1a04, 0x1b60, 0xa188, 0x0007, 0x8114, 0x8214, ++ 0x8214, 0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, ++ 0x810b, 0x080c, 0x1f58, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, ++ 0x0001, 0x7804, 0xd0fc, 0x0de8, 0x7803, 0x0002, 0x7803, 0x0004, ++ 0x780f, 0x00f6, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, ++ 0x080c, 0x9613, 0x080c, 0x1fae, 0x0838, 0x8001, 0x7002, 0xd194, ++ 0x01b0, 0x7804, 0xd0fc, 0x1904, 0x1d91, 0xd09c, 0x0138, 0x7804, ++ 0xd0fc, 0x1904, 0x1d91, 0xd09c, 0x1904, 0x1d95, 0x8aff, 0x0904, ++ 0x1dec, 0x2009, 0x0001, 0x080c, 0x1a5f, 0x0804, 0x1dec, 0xa184, ++ 0x0888, 0x1148, 0x8aff, 0x0904, 0x1dec, 0x2009, 0x0001, 0x080c, ++ 0x1a5f, 0x0804, 0x1dec, 0x7818, 0x6812, 0x7a1c, 0x6a16, 0xa205, ++ 0x0904, 0x1c96, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, ++ 0x1d73, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0029, 0x1118, 0xd19c, ++ 0x1904, 0x1c96, 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, 0x1df0, 0x001e, 0x6b28, 0x6a2c, 0x080c, ++ 0x239f, 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, ++ 0xa31a, 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, ++ 0x00de, 0xd194, 0x0904, 0x1c10, 0x2a00, 0x6826, 0x2c00, 0x681a, ++ 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x6b2a, 0x6a2e, 0x003e, ++ 0x002e, 0x0804, 0x1cbc, 0x0056, 0x7d0c, 0x080c, 0xc55e, 0x005e, ++ 0x080c, 0x1ec3, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118, ++ 0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, ++ 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, ++ 0x1dec, 0x7804, 0xd09c, 0x0904, 0x1b8b, 0x7c20, 0x7824, 0xa405, ++ 0x1904, 0x1b8b, 0x7818, 0x6812, 0x7c1c, 0x6c16, 0xa405, 0x1120, ++ 0x7803, 0x0002, 0x0804, 0x1c96, 0x7520, 0x7424, 0x7728, 0x762c, ++ 0x7018, 0xa528, 0x701c, 0xa421, 0xa7b9, 0x0000, 0xa6b1, 0x0000, ++ 0x7830, 0xa506, 0x1150, 0x7834, 0xa406, 0x1138, 0x7838, 0xa706, ++ 0x1120, 0x783c, 0xa606, 0x0904, 0x1b8b, 0x7803, 0x0002, 0x0804, ++ 0x1d22, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0180, ++ 0x6808, 0x8001, 0x680a, 0x1160, 0x7004, 0x2060, 0x2009, 0x0048, ++ 0x601c, 0xa086, 0x0009, 0x1110, 0x080c, 0x1519, 0x080c, 0x9613, ++ 0x080c, 0x19c0, 0x0088, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, ++ 0x2060, 0x6010, 0xa005, 0x0da0, 0x2068, 0x6808, 0x8000, 0x680a, ++ 0x6c28, 0x6b2c, 0x080c, 0x19d3, 0x001e, 0x000e, 0x012e, 0x0005, ++ 0x700c, 0x7110, 0xa106, 0x0904, 0x1e96, 0x7004, 0x0016, 0x210c, ++ 0xa106, 0x001e, 0x0904, 0x1e96, 0x00d6, 0x00c6, 0x216c, 0x2d00, ++ 0xa005, 0x0904, 0x1e94, 0x681c, 0xa086, 0x0008, 0x0904, 0x1e94, ++ 0x6820, 0xd0d4, 0x1904, 0x1e94, 0x6810, 0x2068, 0x080c, 0x7684, ++ 0x0904, 0x1e94, 0x6850, 0xd0fc, 0x05a8, 0x8108, 0x2104, 0x6b2c, ++ 0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0x6a28, 0xa206, 0x1904, ++ 0x1e94, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x701a, ++ 0x6870, 0x7826, 0x701e, 0x681c, 0x7832, 0x7022, 0x6820, 0x7836, ++ 0x7026, 0x6818, 0x2060, 0x6034, 0xd09c, 0x0168, 0x6830, 0x2005, ++ 0x00d6, 0xac68, 0x6808, 0x783a, 0x702a, 0x680c, 0x783e, 0x702e, ++ 0x00de, 0x0804, 0x1e8e, 0xa006, 0x783a, 0x783e, 0x702a, 0x702e, ++ 0x0804, 0x1e8e, 0x8108, 0x2104, 0xa005, 0x1904, 0x1e94, 0x6b2c, ++ 0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0xa005, 0x15e8, 0x6a28, ++ 0xa206, 0x15d0, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2005, 0x6918, ++ 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x11a0, 0x6008, 0x7822, ++ 0x701a, 0x686e, 0x600c, 0x7826, 0x701e, 0x6872, 0x6000, 0x7832, ++ 0x7022, 0x6004, 0x7836, 0x7026, 0xa006, 0x783a, 0x783e, 0x702a, ++ 0x702e, 0x00a0, 0x6010, 0x7822, 0x701a, 0x686e, 0x6014, 0x7826, ++ 0x701e, 0x6872, 0x6000, 0x7832, 0x7022, 0x6004, 0x7836, 0x7026, ++ 0x6008, 0x783a, 0x702a, 0x600c, 0x783e, 0x702e, 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, 0x1fae, 0x0005, 0x0126, 0x2091, ++ 0x2200, 0x7000, 0xa086, 0x0003, 0x1160, 0x700c, 0x7110, 0xa106, ++ 0x0140, 0x080c, 0x2b06, 0x20e1, 0x9028, 0x700f, 0xc977, 0x7013, ++ 0xc977, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f22, 0x11b8, 0x2001, ++ 0x0160, 0x2003, 0x0000, 0x2001, 0x0138, 0x2003, 0x0000, 0x2011, ++ 0x00c8, 0xe000, 0xe000, 0x8211, 0x1de0, 0x0481, 0x0066, 0x2031, ++ 0x0000, 0x080c, 0x5fa4, 0x006e, 0x00ce, 0x0005, 0x080c, 0x1f2d, ++ 0x080c, 0x2b06, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x0190, ++ 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, ++ 0x600a, 0xa188, 0x0003, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, ++ 0x7112, 0x0c50, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0160, ++ 0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005, 0x080c, 0x2b06, ++ 0x20e1, 0x9028, 0x2001, 0x015d, 0x2003, 0x0000, 0x00e6, 0x00c6, ++ 0x0016, 0x2071, 0xc96a, 0x700c, 0x7110, 0xa106, 0x0190, 0x2104, ++ 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, ++ 0xa188, 0x0003, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, 0x7112, ++ 0x0c50, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, ++ 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, ++ 0x5f22, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1f3c, 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, 0xc992, ++ 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, 0xc992, 0x2004, 0xa086, 0x0000, 0x0178, 0x2001, 0x0132, ++ 0x2004, 0xa436, 0x0110, 0x2020, 0x0c00, 0x2001, 0x0021, 0x2004, ++ 0xd0fc, 0x09e8, 0x080c, 0x222c, 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, 0x1e97, ++ 0x0130, 0x7908, 0xd1ec, 0x1128, 0x790c, 0xd1a4, 0x0960, 0x080c, ++ 0x1ec3, 0xa006, 0x002e, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x0026, ++ 0x2071, 0xc96a, 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, ++ 0x0000, 0x01a8, 0x8211, 0x0188, 0x2001, 0x0005, 0x2004, 0xd08c, ++ 0x0dc8, 0x7904, 0xa18c, 0x0780, 0x0016, 0x080c, 0x1b83, 0x001e, ++ 0x81ff, 0x1118, 0x2011, 0x0050, 0x0c48, 0xa085, 0x0001, 0x002e, ++ 0x001e, 0x00ee, 0x00fe, 0x0005, 0x7803, 0x0004, 0x2009, 0x0064, ++ 0x7804, 0xd0ac, 0x0904, 0x2060, 0x8109, 0x1dd0, 0x2009, 0x0100, ++ 0x210c, 0xa18a, 0x0003, 0x0a0c, 0x1519, 0x080c, 0x2333, 0x00e6, ++ 0x00f6, 0x2071, 0xc959, 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, 0x1519, 0x2079, ++ 0x0010, 0x000e, 0x783e, 0x000e, 0x783a, 0x000e, 0x7836, 0x000e, ++ 0x7832, 0x000e, 0x7822, 0x000e, 0x7802, 0x00fe, 0x00ee, 0x0030, ++ 0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1519, 0x080c, 0x7f6e, ++ 0x0005, 0x00e6, 0x2071, 0xc992, 0x7003, 0x0000, 0x00ee, 0x0005, ++ 0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, 0x20ed, ++ 0x6934, 0xa184, 0x0007, 0x0002, 0x207c, 0x20d8, 0x207c, 0x207e, ++ 0x207c, 0x20bf, 0x209e, 0x208d, 0x080c, 0x1519, 0x2100, 0xa084, ++ 0x00ff, 0xa086, 0x0013, 0x0904, 0x20d8, 0x2100, 0xa084, 0x00ff, ++ 0xa086, 0x001b, 0x0904, 0x20d8, 0x0c78, 0x684c, 0xd0b4, 0x0904, ++ 0x21e9, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, ++ 0x680a, 0x6880, 0x680e, 0x6958, 0x0804, 0x20e0, 0x6834, 0xa084, ++ 0x00ff, 0xa086, 0x001e, 0x19c0, 0x684c, 0xd0b4, 0x0904, 0x21e9, ++ 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, ++ 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, ++ 0x000f, 0xa080, 0x23c7, 0x2005, 0x6832, 0x6958, 0x0450, 0xa18c, ++ 0x00ff, 0xa186, 0x0015, 0x1548, 0x684c, 0xd0b4, 0x0904, 0x21e9, ++ 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, ++ 0x23c7, 0x2005, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0088, ++ 0x684c, 0xd0b4, 0x0904, 0x1b5e, 0x6958, 0xa006, 0x682e, 0x682a, ++ 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2005, ++ 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x00de, 0x0005, 0x00f6, ++ 0x2079, 0x0020, 0x7804, 0xd0fc, 0x190c, 0x222c, 0x00e6, 0x00d6, ++ 0x2071, 0xc992, 0x7000, 0xa005, 0x1904, 0x2155, 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, 0x241b, 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, 0x21e2, 0x700c, 0x7214, 0xa23a, 0x7010, 0x7218, 0xa203, ++ 0x0a04, 0x21e1, 0xa705, 0x0904, 0x21e1, 0xa03e, 0x2730, 0x6850, ++ 0xd0fc, 0x11a8, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x21b0, ++ 0x2195, 0x2195, 0x21b0, 0x21b0, 0x21a9, 0x21b0, 0x2195, 0x21b0, ++ 0x219a, 0x219a, 0x21b0, 0x21b0, 0x21b0, 0x21a1, 0x219a, 0xc0fc, ++ 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x05c8, 0x00d6, ++ 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0490, 0x6b08, 0x6a0c, 0x6d00, ++ 0x6c04, 0x0468, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, ++ 0x0430, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, ++ 0x1138, 0x00de, 0x080c, 0x2389, 0x1904, 0x215f, 0xa00e, 0x0490, ++ 0x2d10, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0013, ++ 0x2268, 0x09d8, 0x2d10, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, ++ 0xa086, 0x001b, 0x2268, 0x09b0, 0x00de, 0x080c, 0x1519, 0x00de, ++ 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, ++ 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, ++ 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c, 0x2389, ++ 0x0008, 0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, ++ 0x0005, 0x080c, 0x1519, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, ++ 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, ++ 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, 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, ++ 0xa961, 0x00ce, 0x2001, 0xc936, 0x2004, 0xac06, 0x1150, 0x20e1, ++ 0x9040, 0x080c, 0x90f6, 0x2011, 0x0000, 0x080c, 0x8f18, 0x080c, ++ 0x7f6e, 0x002e, 0x0804, 0x22e6, 0x0126, 0x2091, 0x2400, 0x0006, ++ 0x0016, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071, ++ 0xc992, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, ++ 0x0700, 0x1904, 0x21eb, 0x7000, 0x0002, 0x22e6, 0x2249, 0x22b9, ++ 0x22e4, 0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, 0x2009, ++ 0x0001, 0x080c, 0x2159, 0x0904, 0x22e6, 0x2009, 0x0001, 0x080c, ++ 0x2159, 0x0804, 0x22e6, 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, 0x239f, 0x6850, 0xc0fd, 0x6852, 0x2a00, ++ 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0804, ++ 0x22e6, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, ++ 0x0100, 0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x0036, ++ 0x2019, 0x1000, 0x8319, 0x090c, 0x1519, 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, ++ 0x223c, 0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c, ++ 0x2159, 0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x239f, ++ 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, ++ 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, ++ 0x0804, 0x226c, 0x0804, 0x2268, 0x080c, 0x1519, 0x00ce, 0x00de, ++ 0x00ee, 0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, ++ 0x2071, 0xc992, 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, 0x0020, ++ 0x0016, 0x2009, 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, 0x020c, ++ 0x210c, 0xa184, 0x0003, 0x0168, 0x080c, 0xc5a7, 0x2001, 0x0133, ++ 0x2004, 0xa005, 0x090c, 0x1519, 0x20e1, 0x9040, 0x2001, 0x020c, ++ 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, ++ 0x1110, 0x20e1, 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, 0x222c, ++ 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, 0xc992, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540, ++ 0x7004, 0x2060, 0x6010, 0x2068, 0x080c, 0xac91, 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, 0xa961, ++ 0x20e1, 0x9040, 0x080c, 0x90f6, 0x2011, 0x0000, 0x080c, 0x8f18, ++ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, ++ 0xa205, 0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x2068, ++ 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, ++ 0x7003, 0x0000, 0x2069, 0xc927, 0x6833, 0x0000, 0x683f, 0x0000, ++ 0x08f8, 0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168, ++ 0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2045, ++ 0x88ff, 0x090c, 0x1519, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, ++ 0x8841, 0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000, ++ 0xa005, 0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, ++ 0xa080, 0x23d7, 0x2045, 0x88ff, 0x090c, 0x1519, 0x0005, 0x0000, ++ 0x0011, 0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, ++ 0x000f, 0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, ++ 0x23bc, 0x23b8, 0x23bc, 0x23bc, 0x23c6, 0x0000, 0x23bc, 0x0000, ++ 0x23c3, 0x23c0, 0x23c3, 0x23c3, 0x0000, 0x23c6, 0x23c3, 0x0000, ++ 0x23be, 0x23be, 0x0000, 0x23be, 0x23c6, 0x0000, 0x23be, 0x0000, ++ 0x23c4, 0x23c4, 0x0000, 0x23c4, 0x0000, 0x23c6, 0x23c4, 0x0136, ++ 0x0146, 0x0156, 0x2099, 0xc765, 0x20a1, 0x0018, 0x20a9, 0x0008, ++ 0x53a3, 0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0041, ++ 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x700b, 0xc760, 0x012e, ++ 0x015e, 0x014e, 0x013e, 0x0005, 0x2099, 0x0014, 0x7803, 0x0040, ++ 0x2001, 0xc765, 0x2004, 0x2010, 0x080c, 0x72ad, 0x2009, 0xc699, ++ 0x2104, 0xa084, 0xfffc, 0x200a, 0x080c, 0x721f, 0x7007, 0x0000, ++ 0x080c, 0x1676, 0x0005, 0x00a6, 0x0096, 0x0086, 0x6b2e, 0x6c2a, ++ 0x6858, 0xa055, 0x0904, 0x24ac, 0x2d60, 0x6034, 0xa0cc, 0x000f, ++ 0xa9c0, 0x23c7, 0xa986, 0x0007, 0x0130, 0xa986, 0x000e, 0x0118, ++ 0xa986, 0x000f, 0x1120, 0x605c, 0xa422, 0x6060, 0xa31b, 0x2805, ++ 0xa045, 0x1140, 0x0310, 0x0804, 0x24ac, 0x6004, 0xa065, 0x0904, ++ 0x24ac, 0x0c18, 0x2805, 0xa005, 0x01a8, 0xac68, 0xd99c, 0x1128, ++ 0x6808, 0xa422, 0x680c, 0xa31b, 0x0020, 0x6810, 0xa422, 0x6814, ++ 0xa31b, 0x0620, 0x2300, 0xa405, 0x0150, 0x8a51, 0x0904, 0x24ac, ++ 0x8840, 0x0c40, 0x6004, 0xa065, 0x0904, 0x24ac, 0x0830, 0x8a51, ++ 0x0904, 0x24ac, 0x8840, 0x2805, 0xa005, 0x1158, 0x6004, 0xa065, ++ 0x0904, 0x24ac, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x23c7, 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, 0x1519, 0x6800, 0xa420, 0x6804, 0xa319, 0x0060, 0x6910, ++ 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x0a0c, 0x1519, 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, ++ 0x24c0, 0x24c1, 0x24c4, 0x24c7, 0x24cc, 0x24cf, 0x24d4, 0x24d9, ++ 0x0005, 0x080c, 0x222c, 0x0005, 0x080c, 0x1b83, 0x0005, 0x080c, ++ 0x1b83, 0x080c, 0x222c, 0x0005, 0x080c, 0x1729, 0x0005, 0x080c, ++ 0x222c, 0x080c, 0x1729, 0x0005, 0x080c, 0x1b83, 0x080c, 0x1729, ++ 0x0005, 0x080c, 0x1b83, 0x080c, 0x222c, 0x080c, 0x1729, 0x0005, ++ 0x0006, 0x0016, 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, 0x2104, ++ 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x24e7, 0x015e, ++ 0x001e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x2071, 0xc96a, 0x700c, ++ 0x7110, 0xa106, 0x01b8, 0x2104, 0xa005, 0x0138, 0xa080, 0x0004, ++ 0x2004, 0x2068, 0x080c, 0x7684, 0x0158, 0xa188, 0x0003, 0xa182, ++ 0xc992, 0x0210, 0x2009, 0xc977, 0x700c, 0xa106, 0x1d60, 0x0010, ++ 0xa085, 0x0001, 0x00de, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2600, ++ 0x2079, 0x0200, 0x2071, 0xcc80, 0x2069, 0xc600, 0x080c, 0x260b, ++ 0x080c, 0x25fb, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004, 0x080c, ++ 0x29a2, 0x781b, 0x0002, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a9, ++ 0x0080, 0x782f, 0x0000, 0x1f04, 0x2531, 0x20e1, 0x9080, 0x783b, ++ 0x001f, 0x20e1, 0x8700, 0x012e, 0x0005, 0x0126, 0x2091, 0x2600, ++ 0x781c, 0xd0a4, 0x190c, 0x25f8, 0xa084, 0x0007, 0x0002, 0x2561, ++ 0x254f, 0x2552, 0x2555, 0x255a, 0x255c, 0x255e, 0x2560, 0x080c, ++ 0x68c9, 0x0078, 0x080c, 0x6916, 0x0060, 0x080c, 0x68c9, 0x080c, ++ 0x6916, 0x0038, 0x0041, 0x0028, 0x0031, 0x0018, 0x0021, 0x0008, ++ 0x0011, 0x012e, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xc5a7, ++ 0x7930, 0xa184, 0x0003, 0x01b0, 0x2001, 0xc936, 0x2004, 0xa005, ++ 0x0170, 0x2001, 0x0133, 0x2004, 0xa005, 0x090c, 0x1519, 0x00c6, ++ 0x2001, 0xc936, 0x2064, 0x080c, 0xa961, 0x00ce, 0x04b8, 0x20e1, ++ 0x9040, 0x04a0, 0xa184, 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, ++ 0x1108, 0x00a0, 0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, ++ 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, ++ 0x5f66, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x4e5b, 0x080c, 0x25fb, ++ 0x00a8, 0xa184, 0x00c0, 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056, ++ 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, 0x003e, 0x00ee, ++ 0x0028, 0xa184, 0x0300, 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e, ++ 0x001e, 0x000e, 0x0005, 0x0016, 0x00e6, 0x00f6, 0x2071, 0xc600, ++ 0x7128, 0x2001, 0xc8d8, 0x2102, 0x2001, 0xc8e0, 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, 0x29a2, 0x00fe, 0x00ee, 0x001e, 0x0005, ++ 0x7938, 0x080c, 0x1519, 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, 0x261b, ++ 0x7837, 0x0001, 0x7837, 0x0000, 0xe000, 0xe000, 0x20e1, 0xa000, ++ 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0xc600, ++ 0x6024, 0x6026, 0x6053, 0x0030, 0x080c, 0x29e1, 0x6050, 0xa084, ++ 0xfe7f, 0x6052, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x29f1, ++ 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, ++ 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0e9f, 0x601b, ++ 0x001e, 0x600f, 0x00ff, 0x2001, 0xc8d4, 0x2003, 0x00ff, 0x602b, ++ 0x002f, 0x012e, 0x0005, 0x2001, 0xc632, 0x2003, 0x0000, 0x2001, ++ 0xc631, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, ++ 0x0016, 0x0026, 0x6124, 0x0066, 0x2031, 0xc635, 0x2634, 0xa6b4, ++ 0x0028, 0x006e, 0x11c0, 0x6020, 0xd0bc, 0x01a8, 0xd1bc, 0x0198, ++ 0x783c, 0xa005, 0x0180, 0x00e6, 0x0006, 0x2070, 0x701c, 0xa086, ++ 0x0009, 0x000e, 0x00ee, 0x1138, 0x00e6, 0x783c, 0x2070, 0x7008, ++ 0xd0fc, 0x00ee, 0x1130, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, ++ 0x002a, 0xa195, 0x0004, 0xa284, 0x0007, 0x0002, 0x26b8, 0x269e, ++ 0x26a1, 0x26a4, 0x26a9, 0x26ab, 0x26af, 0x26b3, 0x080c, 0x7873, ++ 0x00b8, 0x080c, 0x794e, 0x00a0, 0x080c, 0x794e, 0x080c, 0x7873, ++ 0x0078, 0x0099, 0x0068, 0x080c, 0x7873, 0x0079, 0x0048, 0x080c, ++ 0x794e, 0x0059, 0x0028, 0x080c, 0x794e, 0x080c, 0x7873, 0x0029, ++ 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c, ++ 0x0118, 0xd19c, 0x1904, 0x2910, 0x080c, 0x5f22, 0x0578, 0x7000, ++ 0xa086, 0x0003, 0x0198, 0x6024, 0xa084, 0x1800, 0x0178, 0x080c, ++ 0x5f48, 0x0118, 0x080c, 0x5f34, 0x1148, 0x6027, 0x0020, 0x6043, ++ 0x0000, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0458, 0x080c, 0x5f48, ++ 0x15d0, 0x6024, 0xa084, 0x1800, 0x1108, 0x04a8, 0x2001, 0xc8e5, ++ 0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, ++ 0x2003, 0x0001, 0x080c, 0x5e5a, 0x0804, 0x2910, 0xd1ac, 0x1518, ++ 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc, ++ 0x0130, 0x708c, 0xa086, 0x0028, 0x1110, 0x080c, 0x60b1, 0x0804, ++ 0x2910, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x0048, 0x2001, 0xc8e6, ++ 0x2003, 0x0002, 0x0020, 0x080c, 0x6024, 0x0804, 0x2910, 0x080c, ++ 0x6156, 0x0804, 0x2910, 0x6220, 0xd1bc, 0x0568, 0xd2bc, 0x0558, ++ 0x783c, 0xa005, 0x0540, 0x00e6, 0x2070, 0x7008, 0xd0fc, 0x00ee, ++ 0x0510, 0x6028, 0xc0bc, 0x602a, 0x0026, 0x0036, 0x6288, 0x638c, ++ 0x608b, 0xbc91, 0x608f, 0xffff, 0x6043, 0x0001, 0xe000, 0xe000, ++ 0x6027, 0x0080, 0x6017, 0x0000, 0x6043, 0x0000, 0x628a, 0x638e, ++ 0x003e, 0x002e, 0x0016, 0x2001, 0xc696, 0x200c, 0xc184, 0x2102, ++ 0x001e, 0x0804, 0x2969, 0xd1ac, 0x0904, 0x284c, 0x0036, 0x6328, ++ 0xc3bc, 0x632a, 0x003e, 0x080c, 0x5f22, 0x11d8, 0x6027, 0x0020, ++ 0x0006, 0x0026, 0x0036, 0x080c, 0x5f3e, 0x1170, 0x2001, 0xc8e6, ++ 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0x080c, 0x5e5a, ++ 0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, ++ 0x5ef9, 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, 0x407d, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, ++ 0xa084, 0x00ff, 0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, ++ 0x2011, 0xc653, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, ++ 0xc653, 0x2214, 0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, ++ 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, ++ 0x0904, 0x2819, 0x7034, 0xd08c, 0x1140, 0x2001, 0xc60c, 0x200c, ++ 0xd1ac, 0x1904, 0x2819, 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011, ++ 0x8013, 0x080c, 0x407d, 0x003e, 0x0804, 0x2819, 0x7034, 0xd08c, ++ 0x1140, 0x2001, 0xc60c, 0x200c, 0xd1ac, 0x1904, 0x2819, 0xc1ad, ++ 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x407d, 0x003e, ++ 0x7130, 0xc185, 0x7132, 0x2011, 0xc653, 0x220c, 0xd1a4, 0x01d0, ++ 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x712e, 0x2019, ++ 0x000e, 0x080c, 0xc10d, 0xa484, 0x00ff, 0xa080, 0x2f6e, 0x200d, ++ 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, ++ 0xc190, 0x001e, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, ++ 0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x080c, 0x533d, 0x1110, 0x080c, 0x4f47, 0x8108, 0x1f04, 0x2810, ++ 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, ++ 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, ++ 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001, 0xc600, ++ 0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, 0x6228, 0xc29d, ++ 0x622a, 0x2003, 0x0001, 0x2001, 0xc623, 0x2003, 0x0000, 0x6027, ++ 0x0020, 0x080c, 0x5f48, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011, ++ 0x5e37, 0x080c, 0x7036, 0x001e, 0xd194, 0x0904, 0x2910, 0x0016, ++ 0x6220, 0xd2b4, 0x0904, 0x28b5, 0x080c, 0x7024, 0x080c, 0x8bf5, ++ 0x6027, 0x0004, 0x00f6, 0x2019, 0xc930, 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, 0x7db1, 0x080c, ++ 0x7e94, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x95e3, ++ 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe, 0x00d6, ++ 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000, ++ 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xc927, 0x6028, 0xa09a, ++ 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8be8, 0x0804, ++ 0x290f, 0x2019, 0xc930, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027, ++ 0x080c, 0x9613, 0x00ce, 0x0804, 0x290f, 0xd2bc, 0x0904, 0x290f, ++ 0x080c, 0x7031, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016, ++ 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, ++ 0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, ++ 0xc927, 0x6044, 0xa09a, 0x00c8, 0x1620, 0x8000, 0x6046, 0x603c, ++ 0x00ce, 0xa005, 0x05a0, 0x2009, 0x07d0, 0x080c, 0x7029, 0xa080, ++ 0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c, 0x0184, ++ 0xa18d, 0x0012, 0x6116, 0x0418, 0xa080, 0x0007, 0x2004, 0xa086, ++ 0x0009, 0x0d98, 0x6114, 0xa18c, 0x0184, 0xa18d, 0x0016, 0x6116, ++ 0x00b0, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x2019, ++ 0xc936, 0x2304, 0xa065, 0x0150, 0x2009, 0x004f, 0x601c, 0xa086, ++ 0x0009, 0x1110, 0x2009, 0x0105, 0x080c, 0x9613, 0x00ce, 0x001e, ++ 0xd19c, 0x0904, 0x2969, 0x7034, 0xd0ac, 0x1560, 0x0016, 0x0156, ++ 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x0006, 0x1d04, 0x291e, ++ 0x2091, 0x6000, 0x1f04, 0x291e, 0x602f, 0x0000, 0x6150, 0xa185, ++ 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x292c, 0x2091, 0x6000, ++ 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, ++ 0x0480, 0x080c, 0x2ab1, 0x1f04, 0x292c, 0x015e, 0x6152, 0x001e, ++ 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, ++ 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, ++ 0x0036, 0x2019, 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, ++ 0x080c, 0xc586, 0x080c, 0xc5a1, 0xa085, 0x0001, 0x080c, 0x5f66, ++ 0x2001, 0xc600, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12e1, ++ 0x001e, 0xa18c, 0xffd0, 0x6126, 0x0005, 0x0006, 0x0016, 0x0026, ++ 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc600, 0x71c4, ++ 0x70c6, 0xa116, 0x0500, 0x81ff, 0x0128, 0x2011, 0x8011, 0x080c, ++ 0x407d, 0x00c8, 0x2011, 0x8012, 0x080c, 0x407d, 0x2001, 0xc672, ++ 0x2004, 0xd0fc, 0x1180, 0x0036, 0x00c6, 0x080c, 0x2a3c, 0x080c, ++ 0x8dca, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0000, 0x080c, ++ 0x2e19, 0x00ce, 0x003e, 0x012e, 0x00fe, 0x00ee, 0x002e, 0x001e, ++ 0x000e, 0x0005, 0x00c6, 0x00f6, 0x0006, 0x0026, 0x2061, 0x0100, ++ 0xa190, 0x29b5, 0x2205, 0x60f2, 0x2011, 0x29c2, 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, 0x6be0, 0x0038, 0xa080, 0x2f6e, 0x200d, 0xa18c, 0xff00, ++ 0x810f, 0xa006, 0x0005, 0xa080, 0x2f6e, 0x200d, 0xa18c, 0x00ff, ++ 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0xc615, 0x2003, 0x00ef, ++ 0x20a9, 0x0010, 0xa006, 0x6852, 0x6856, 0x1f04, 0x29ec, 0x00de, ++ 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0xc615, ++ 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, ++ 0x0000, 0xa006, 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xc5b5, ++ 0x2005, 0x6856, 0x8211, 0x1f04, 0x2a01, 0x002e, 0x00de, 0x000e, ++ 0x0005, 0x00c6, 0x2061, 0xc600, 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, 0x2a31, 0x680f, 0x0000, 0x000e, 0x001e, ++ 0x002e, 0x00de, 0x015e, 0x0005, 0x2001, 0xc653, 0x2004, 0xd0c4, ++ 0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002e, ++ 0x080c, 0xc190, 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, 0x783f, 0x2011, 0x0030, 0x2200, 0x8007, ++ 0xa085, 0x004c, 0x78c2, 0x2009, 0x0204, 0x210c, 0x2200, 0xa100, ++ 0x2009, 0x0138, 0x200a, 0x080c, 0x5f22, 0x1118, 0x2009, 0xc8d6, ++ 0x200a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, ++ 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, ++ 0x200c, 0x8000, 0x2014, 0xa184, 0x0003, 0x0110, 0x0804, 0x1b81, ++ 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, 0x2ab8, 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, 0x29f1, 0x000e, 0x00ce, 0x001e, 0x0005, 0x2009, 0x0171, ++ 0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, ++ 0xe000, 0xe000, 0x200a, 0x0005, 0x2ba4, 0x2ba8, 0x2bac, 0x2bb2, ++ 0x2bb8, 0x2bbe, 0x2bc4, 0x2bcc, 0x2bd4, 0x2bda, 0x2be0, 0x2be8, ++ 0x2bf0, 0x2bf8, 0x2c00, 0x2c0a, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c16, 0x2c16, 0x2c1c, 0x2c1c, ++ 0x2c23, 0x2c23, 0x2c2a, 0x2c2a, 0x2c33, 0x2c33, 0x2c3a, 0x2c3a, ++ 0x2c43, 0x2c43, 0x2c4c, 0x2c4c, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x0106, 0x0006, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, ++ 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, ++ 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, ++ 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, ++ 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x253d, ++ 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x24b2, 0x080c, 0x253d, ++ 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x24b2, ++ 0x080c, 0x253d, 0x0804, 0x2c5f, 0xe000, 0x0cf0, 0x0106, 0x0006, ++ 0x080c, 0x2a80, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2a80, ++ 0x080c, 0x2664, 0x04e0, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, ++ 0x24b2, 0x04a8, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, 0x2664, ++ 0x080c, 0x24b2, 0x0460, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, ++ 0x253d, 0x0428, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, 0x2664, ++ 0x080c, 0x253d, 0x00e0, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, ++ 0x24b2, 0x080c, 0x253d, 0x0098, 0x0106, 0x0006, 0x080c, 0x2a80, ++ 0x080c, 0x2664, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0040, 0x20d1, ++ 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x1519, 0x000e, ++ 0x010e, 0x000d, 0x00c6, 0x0026, 0x0046, 0x2021, 0x0000, 0x080c, ++ 0x570b, 0x1904, 0x2d3f, 0x72d4, 0x2001, 0xc8e5, 0x2004, 0xa005, ++ 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2d3f, ++ 0x080c, 0x2d43, 0x0804, 0x2d3f, 0xd2cc, 0x1904, 0x2d3f, 0x080c, ++ 0x5f22, 0x1120, 0x709f, 0xffff, 0x0804, 0x2d3f, 0xd294, 0x0120, ++ 0x709f, 0xffff, 0x0804, 0x2d3f, 0x2001, 0xc615, 0x203c, 0x7288, ++ 0xd284, 0x0904, 0x2ce1, 0xd28c, 0x1904, 0x2ce1, 0x0036, 0x739c, ++ 0xa38e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xcdc0, ++ 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, 0x29c7, ++ 0x080c, 0x52e1, 0x11b8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x1150, 0x7030, 0xd08c, 0x0118, 0x6000, 0xd0bc, 0x0120, 0x080c, ++ 0x2d56, 0x0140, 0x0028, 0x080c, 0x2e87, 0x080c, 0x2d84, 0x0110, ++ 0x8318, 0x0818, 0x739e, 0x0010, 0x709f, 0xffff, 0x003e, 0x0804, ++ 0x2d3f, 0xa780, 0x2f6e, 0x203d, 0xa7bc, 0xff00, 0x873f, 0x2041, ++ 0x007e, 0x709c, 0xa096, 0xffff, 0x1120, 0x2009, 0x0000, 0x28a8, ++ 0x0050, 0xa812, 0x0220, 0x2008, 0xa802, 0x20a8, 0x0020, 0x709f, ++ 0xffff, 0x0804, 0x2d3f, 0x2700, 0x0156, 0x0016, 0xa106, 0x05a0, ++ 0xc484, 0x080c, 0x533d, 0x0120, 0x080c, 0x52e1, 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, 0x5300, 0x0028, 0x080c, 0x2f14, 0x0170, 0x080c, 0x2f41, ++ 0x0058, 0x080c, 0x2e87, 0x080c, 0x2d84, 0x0170, 0x0028, 0x080c, ++ 0x2f14, 0x0110, 0x0419, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, ++ 0x2cfb, 0x709f, 0xffff, 0x0018, 0x001e, 0x015e, 0x719e, 0x004e, ++ 0x002e, 0x00ce, 0x0005, 0x00c6, 0x0016, 0x709f, 0x0001, 0x2009, ++ 0x007e, 0x080c, 0x52e1, 0x1138, 0x080c, 0x2e87, 0x04a9, 0x0118, ++ 0x70d4, 0xc0bd, 0x70d6, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, ++ 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, ++ 0x6842, 0x080c, 0xaf0d, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xb05e, ++ 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0000, ++ 0x080c, 0x5291, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, ++ 0x012e, 0x2009, 0x0004, 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, ++ 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, ++ 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, ++ 0xaf0d, 0x0550, 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, ++ 0xa086, 0x007e, 0x0140, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x1110, 0x080c, 0x2e46, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, ++ 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0002, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, ++ 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x52e1, 0x1120, ++ 0x0031, 0x0110, 0x70db, 0xffff, 0x002e, 0x00ce, 0x0005, 0x0016, ++ 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x958d, 0x01e8, 0x2d00, ++ 0x601a, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, ++ 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x2e46, 0x70dc, 0x8000, 0x70de, 0x012e, 0x2009, 0x0002, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, ++ 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, ++ 0x080c, 0x52e1, 0x1190, 0x2c68, 0x080c, 0x958d, 0x0170, 0x2d00, ++ 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c, 0xb05e, 0x2009, ++ 0x0022, 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce, ++ 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x7b22, ++ 0x080c, 0x7abb, 0x080c, 0xa090, 0x2130, 0x81ff, 0x0128, 0x20a9, ++ 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x0016, 0x080c, 0x533d, 0x1120, 0x080c, 0x553e, 0x080c, 0x4f47, ++ 0x001e, 0x8108, 0x1f04, 0x2e30, 0x86ff, 0x1110, 0x080c, 0x11f4, ++ 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, ++ 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, ++ 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, ++ 0x2c08, 0x080c, 0xbef7, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e, ++ 0x6210, 0x6314, 0x080c, 0x4f47, 0x6212, 0x6316, 0x001e, 0x002e, ++ 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x6018, 0xa080, ++ 0x0028, 0x2004, 0xa086, 0x0080, 0x0150, 0x2071, 0xc600, 0x7098, ++ 0xa005, 0x0110, 0x8001, 0x709a, 0x000e, 0x00ee, 0x0005, 0x2071, ++ 0xc600, 0x70dc, 0xa005, 0x0dc0, 0x8001, 0x70de, 0x0ca8, 0x6000, ++ 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0036, 0x0026, ++ 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0098, ++ 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006, ++ 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xc190, 0x004e, 0x20a9, ++ 0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, 0x007e, 0x0904, 0x2ef3, ++ 0xa28e, 0x007f, 0x0904, 0x2ef3, 0xa28e, 0x0080, 0x05e0, 0xa288, ++ 0xc77b, 0x210c, 0x81ff, 0x05b8, 0x8fff, 0x1148, 0x2001, 0xc905, ++ 0x0006, 0x2003, 0x0001, 0x04d9, 0x000e, 0x2003, 0x0000, 0x00c6, ++ 0x2160, 0x2001, 0x0001, 0x080c, 0x5715, 0x00ce, 0x2019, 0x0029, ++ 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x00c6, ++ 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1118, ++ 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, ++ 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbef7, 0x001e, 0x007e, ++ 0x2160, 0x080c, 0x553e, 0x002e, 0x8210, 0x1f04, 0x2eab, 0x015e, ++ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, ++ 0x0026, 0x0016, 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0148, 0xd0a4, ++ 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xc190, ++ 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, ++ 0x7288, 0x82ff, 0x01f8, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x11d0, ++ 0x2100, 0x080c, 0x29db, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, ++ 0xa2e0, 0xcdc0, 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, 0x9132, 0x002e, ++ 0x080c, 0xc4e4, 0x003e, 0x002e, 0x001e, 0xa180, 0xc77b, 0x2004, ++ 0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, 0xca3c, 0x001e, 0x611a, ++ 0x080c, 0x2e46, 0x001e, 0x080c, 0x5300, 0x012e, 0x00ce, 0x001e, ++ 0x0005, 0x2001, 0xc635, 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, 0xc6a2, ++ 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e, 0x7033, ++ 0xc6b2, 0x7037, 0xc6b2, 0x7007, 0x0001, 0x2061, 0xc6f2, 0x6003, ++ 0x0002, 0x0005, 0x1004, 0x3094, 0x0e04, 0x3094, 0x2071, 0xc6a2, ++ 0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, 0x7820, 0xa08e, 0x0069, ++ 0x1904, 0x3179, 0x0804, 0x3112, 0x0005, 0x2071, 0xc6a2, 0x7004, ++ 0x0002, 0x309d, 0x309e, 0x30a7, 0x30b8, 0x0005, 0x1004, 0x30a6, ++ 0x0e04, 0x30a6, 0x2b78, 0x7818, 0xd084, 0x01e8, 0x0005, 0x2b78, ++ 0x2061, 0xc6f2, 0x6008, 0xa08e, 0x0100, 0x0128, 0xa086, 0x0200, ++ 0x0904, 0x3173, 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, 0x3170, 0x61c4, ++ 0x0804, 0x3112, 0x3154, 0x317f, 0x3187, 0x318b, 0x3193, 0x3199, ++ 0x319d, 0x31a9, 0x31ac, 0x31b6, 0x31b9, 0x3170, 0x3170, 0x3170, ++ 0x31bc, 0x3170, 0x31cb, 0x31e2, 0x31f9, 0x3273, 0x3278, 0x32a1, ++ 0x32f2, 0x3303, 0x3322, 0x335a, 0x3364, 0x3371, 0x3384, 0x33a5, ++ 0x33ae, 0x33e4, 0x33ea, 0x3170, 0x3413, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x341a, 0x3424, 0x3170, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x3170, 0x3170, 0x342c, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x343e, 0x3448, 0x3170, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x0002, 0x3472, 0x34c6, 0x3521, 0x353b, 0x3170, ++ 0x356c, 0x399f, 0x456f, 0x3170, 0x3170, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x3170, 0x31b6, 0x31b9, 0x39a1, 0x3170, 0x39ae, ++ 0x4608, 0x4663, 0x46c7, 0x3170, 0x472a, 0x4754, 0x4773, 0x47a5, ++ 0x3170, 0x3170, 0x3170, 0x39b2, 0x3b57, 0x3b71, 0x3b8f, 0x3bf0, ++ 0x3c50, 0x3c5b, 0x3c93, 0x3ca2, 0x3cb1, 0x3cb4, 0x3cd7, 0x3d21, ++ 0x3d97, 0x3da4, 0x3ea5, 0x3fd4, 0x3ffd, 0x40fb, 0x411d, 0x4129, ++ 0x4162, 0x4232, 0x428c, 0x4352, 0x43a4, 0x4404, 0x4419, 0x4434, ++ 0x44a6, 0x4558, 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x405a, ++ 0x0126, 0x2091, 0x8000, 0x0e04, 0x3160, 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, 0x4067, 0x7823, ++ 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, ++ 0x7930, 0x0804, 0x406a, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, ++ 0x3154, 0x7924, 0x2114, 0x0804, 0x3154, 0x2099, 0x0009, 0x20a1, ++ 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0804, ++ 0x3154, 0x7824, 0x2060, 0x0090, 0x2009, 0x0002, 0x2011, 0x0002, ++ 0x2019, 0x0005, 0x783b, 0x0037, 0x0804, 0x3154, 0x7d38, 0x7c3c, ++ 0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, 0x1000, 0xe10c, 0xa006, ++ 0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0xa005, 0x0904, ++ 0x3154, 0x0804, 0x3176, 0x2069, 0xc652, 0x7824, 0x7930, 0xa11a, ++ 0x1a04, 0x317c, 0x8019, 0x0904, 0x317c, 0x684a, 0x6942, 0x782c, ++ 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x61f8, ++ 0x0804, 0x3154, 0x2069, 0xc652, 0x7824, 0x7934, 0xa11a, 0x1a04, ++ 0x317c, 0x8019, 0x0904, 0x317c, 0x684e, 0x6946, 0x782c, 0x6862, ++ 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c, 0x57d7, 0x0804, ++ 0x3154, 0xa02e, 0x2520, 0x81ff, 0x1904, 0x3179, 0x7924, 0x7b28, ++ 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xc6a9, 0x41a1, 0x080c, 0x4026, ++ 0x0904, 0x3179, 0x2009, 0x0020, 0x080c, 0x4067, 0x701b, 0x3211, ++ 0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0138, ++ 0xa096, 0x0019, 0x0120, 0xa096, 0x0015, 0x1904, 0x3179, 0x810f, ++ 0xa18c, 0x00ff, 0x0904, 0x3179, 0x710e, 0x700c, 0x8001, 0x0528, ++ 0x700e, 0x080c, 0x4026, 0x0904, 0x3179, 0x2009, 0x0020, 0x2061, ++ 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, ++ 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c, 0x4067, 0x701b, ++ 0x3242, 0x0005, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0120, ++ 0xa096, 0x000a, 0x1904, 0x3179, 0x08c0, 0x7010, 0x2068, 0x6838, ++ 0xc0fd, 0x683a, 0x080c, 0x51dd, 0x1128, 0x7007, 0x0003, 0x701b, ++ 0x325c, 0x0005, 0x080c, 0x592e, 0x0126, 0x2091, 0x8000, 0x20a9, ++ 0x0005, 0x2099, 0xc6a9, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, ++ 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, ++ 0x012e, 0x0804, 0x406a, 0x61ac, 0x7824, 0x60ae, 0x0804, 0x3154, ++ 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, 0x3179, 0x7924, 0x810f, 0xa18c, 0x00ff, ++ 0x080c, 0x533d, 0x1904, 0x317c, 0x7e38, 0xa684, 0x3fff, 0xa082, ++ 0x4000, 0x0210, 0x0804, 0x317c, 0x7c28, 0x7d2c, 0x080c, 0x5505, ++ 0xd28c, 0x1118, 0x080c, 0x54ae, 0x0010, 0x080c, 0x54de, 0x1518, ++ 0x2061, 0xce00, 0x0126, 0x2091, 0x8000, 0x6000, 0xa086, 0x0000, ++ 0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, 0xa406, 0x1118, 0x6840, ++ 0xa506, 0x0150, 0x012e, 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, ++ 0xac02, 0x1a04, 0x3179, 0x0c30, 0x080c, 0xa961, 0x012e, 0x0904, ++ 0x3179, 0x0804, 0x3154, 0xa00e, 0x2001, 0x0005, 0x080c, 0x592e, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0xaf09, 0x080c, 0x580a, 0x012e, ++ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, ++ 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5511, 0x0904, ++ 0x3179, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x404b, ++ 0x0904, 0x317c, 0x080c, 0x557d, 0x0904, 0x3179, 0x2019, 0x0005, ++ 0x7924, 0x080c, 0x552c, 0x0904, 0x3179, 0x7828, 0xa08a, 0x1000, ++ 0x1a04, 0x317c, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fb9, ++ 0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, ++ 0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x01f8, ++ 0x2508, 0x080c, 0x533d, 0x11d8, 0x080c, 0x557d, 0x1128, 0x2009, ++ 0x0002, 0x62b4, 0x2518, 0x00c0, 0x2019, 0x0004, 0xa00e, 0x080c, ++ 0x552c, 0x1118, 0x2009, 0x0006, 0x0078, 0x7824, 0xa08a, 0x1000, ++ 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fb9, 0x8529, ++ 0x1ae0, 0x012e, 0x0804, 0x3154, 0x012e, 0x0804, 0x3179, 0x012e, ++ 0x0804, 0x317c, 0x080c, 0x403b, 0x0904, 0x317c, 0x080c, 0x5469, ++ 0x080c, 0x5505, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, ++ 0x403b, 0x0904, 0x317c, 0x080c, 0x545a, 0x080c, 0x5505, 0x0804, ++ 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, 0x317c, ++ 0x080c, 0x54e0, 0x0904, 0x3179, 0x080c, 0x5221, 0x080c, 0x54a7, ++ 0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904, 0x317c, ++ 0x080c, 0x5403, 0x0904, 0x3179, 0x62a0, 0x2019, 0x0005, 0x00c6, ++ 0x080c, 0x553e, 0x2061, 0x0000, 0x080c, 0x7b16, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0x7a0e, 0x2009, 0x0000, 0x080c, 0xbef7, 0x007e, ++ 0x00ce, 0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904, ++ 0x317c, 0x080c, 0x5505, 0x2208, 0x0804, 0x3154, 0x0156, 0x00d6, ++ 0x00e6, 0x2069, 0xc734, 0x6810, 0x6914, 0xa10a, 0x1210, 0x2009, ++ 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x007e, ++ 0x2069, 0xc77b, 0x2d04, 0xa075, 0x0130, 0x704c, 0x0071, 0xa210, ++ 0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, 0x33c2, 0x2300, 0xa218, ++ 0x00ee, 0x00de, 0x015e, 0x0804, 0x3154, 0x00f6, 0x0016, 0xa07d, ++ 0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, ++ 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0xc734, 0x6910, 0x62b0, ++ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x6150, 0xa190, 0x2f6e, ++ 0x2215, 0xa294, 0x00ff, 0x6370, 0x83ff, 0x0108, 0x6274, 0x67d4, ++ 0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac, 0x0118, 0x2031, ++ 0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c, ++ 0x5f22, 0x1118, 0x2031, 0x0004, 0x0010, 0x2031, 0x0000, 0x7e3a, ++ 0x7f3e, 0x0804, 0x3154, 0x6140, 0x6244, 0x2019, 0xc8fd, 0x231c, ++ 0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x6134, 0xa006, 0x2010, ++ 0x6338, 0x012e, 0x0804, 0x3154, 0x080c, 0x404b, 0x0904, 0x317c, ++ 0x6244, 0x6338, 0x0804, 0x3154, 0x6140, 0x6244, 0x7824, 0x6042, ++ 0x7b28, 0x6346, 0x2069, 0xc652, 0x831f, 0xa305, 0x6816, 0x782c, ++ 0x2069, 0xc8fd, 0x2d1c, 0x206a, 0x0804, 0x3154, 0x0126, 0x2091, ++ 0x8000, 0x7824, 0x6036, 0x782c, 0x603a, 0x012e, 0x0804, 0x3154, ++ 0x7838, 0xa005, 0x01a8, 0x7828, 0xa025, 0x0904, 0x317c, 0x782c, ++ 0xa02d, 0x0904, 0x317c, 0xa00e, 0x080c, 0x533d, 0x1120, 0x6244, ++ 0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, 0x0190, 0x8108, 0x0ca0, ++ 0x080c, 0x404b, 0x0904, 0x317c, 0x7828, 0xa00d, 0x0904, 0x317c, ++ 0x782c, 0xa005, 0x0904, 0x317c, 0x6244, 0x6146, 0x6338, 0x603a, ++ 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, ++ 0xa196, 0x00ff, 0x1130, 0x2001, 0xc615, 0x2004, 0xa085, 0xff00, ++ 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2f6e, 0x210d, 0xa18c, ++ 0x00ff, 0x2001, 0xc615, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, ++ 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x958d, 0x000e, 0x01e0, ++ 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c, 0x4026, 0x01d8, ++ 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, ++ 0x683a, 0x701b, 0x351a, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, ++ 0x9613, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3179, ++ 0x00ce, 0x0804, 0x317c, 0x080c, 0x95e3, 0x0cb0, 0x2001, 0xc600, ++ 0x2004, 0xa086, 0x0003, 0x1904, 0x3179, 0x00c6, 0x2061, 0x0100, ++ 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, ++ 0xc615, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, ++ 0xa188, 0x2f6e, 0x210d, 0xa18c, 0x00ff, 0x2001, 0xc615, 0x2004, ++ 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, ++ 0x080c, 0x958d, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f, ++ 0x0001, 0x080c, 0x4026, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, ++ 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, 0x351a, 0x2d00, ++ 0x6012, 0x2009, 0x0032, 0x080c, 0x9613, 0x012e, 0x00ce, 0x0005, ++ 0x012e, 0x00ce, 0x0804, 0x3179, 0x00ce, 0x0804, 0x317c, 0x080c, ++ 0x95e3, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0x0804, ++ 0x3154, 0x2061, 0xc9bc, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, ++ 0x0178, 0x6104, 0x6208, 0x2a60, 0x6068, 0x783a, 0x60b4, 0x783e, ++ 0x60b0, 0x2019, 0x0072, 0x201a, 0x6348, 0x012e, 0x0804, 0x3154, ++ 0xa00e, 0x2110, 0x0c80, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f22, ++ 0x0904, 0x3179, 0x0126, 0x2091, 0x8000, 0x6248, 0x6068, 0xa202, ++ 0x0248, 0xa085, 0x0001, 0x080c, 0x2a11, 0x080c, 0x4968, 0x012e, ++ 0x0804, 0x3154, 0x012e, 0x0804, 0x317c, 0x0006, 0x0016, 0x00c6, ++ 0x00e6, 0x2001, 0xc906, 0x2070, 0x2061, 0xc652, 0x6008, 0x2072, ++ 0x2009, 0x0000, 0x2011, 0x1000, 0x080c, 0x783f, 0x7206, 0x00ee, ++ 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7824, ++ 0xa084, 0x0007, 0x0002, 0x357e, 0x3587, 0x358e, 0x357b, 0x357b, ++ 0x357b, 0x357b, 0x357b, 0x012e, 0x0804, 0x317c, 0x2009, 0x0114, ++ 0x2104, 0xa085, 0x0800, 0x200a, 0x080c, 0x36f9, 0x0070, 0x2009, ++ 0x010b, 0x200b, 0x0010, 0x080c, 0x36f9, 0x0038, 0x81ff, 0x0128, ++ 0x012e, 0x2021, 0x400b, 0x0804, 0x3156, 0x0086, 0x0096, 0x00a6, ++ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3555, 0x2009, ++ 0x0101, 0x210c, 0x0016, 0x2001, 0x0138, 0x200c, 0x2003, 0x0001, ++ 0x0016, 0x2001, 0x007a, 0x2034, 0x2001, 0x007b, 0x202c, 0xa006, ++ 0x2048, 0x2050, 0x2058, 0x080c, 0x3944, 0x080c, 0x38a8, 0xa03e, ++ 0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60, 0x2071, 0xc992, 0x2079, ++ 0x0020, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0140, 0x2001, ++ 0x007d, 0x2004, 0x783e, 0x2001, 0x007c, 0x2004, 0x783a, 0x00de, ++ 0x2011, 0x0001, 0x080c, 0x3854, 0x080c, 0x3854, 0x00ce, 0x00ee, ++ 0x00fe, 0x080c, 0x379f, 0x080c, 0x387c, 0x080c, 0x37f9, 0x080c, ++ 0x375e, 0x080c, 0x378f, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd094, ++ 0x0530, 0x7814, 0xa084, 0x0184, 0xa085, 0x0010, 0x7816, 0x2079, ++ 0x0140, 0x080c, 0x36d7, 0x1110, 0x00fe, 0x0430, 0x7804, 0xd0dc, ++ 0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086, 0x7814, 0xa084, 0x0184, ++ 0xa085, 0x0032, 0x7816, 0x080c, 0x36d7, 0x1110, 0x00fe, 0x00a0, ++ 0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080, 0xa026, 0x7c16, 0x7824, ++ 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x36e1, 0x00fe, 0x0804, 0x36a1, ++ 0x00fe, 0x080c, 0x36d7, 0x1150, 0x8948, 0x2001, 0x007a, 0x2602, ++ 0x2001, 0x007b, 0x2502, 0x080c, 0x36e1, 0x0088, 0x87ff, 0x0140, ++ 0x2001, 0x0201, 0x2004, 0xa005, 0x1904, 0x35db, 0x8739, 0x0038, ++ 0x2001, 0xc96a, 0x2004, 0xa086, 0x0000, 0x1904, 0x35db, 0x2001, ++ 0x0033, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0xa605, ++ 0x0904, 0x36a1, 0x7824, 0xd0bc, 0x0128, 0x2900, 0xaa05, 0xab05, ++ 0x1904, 0x36a1, 0x6033, 0x000d, 0x2001, 0x0030, 0x2003, 0x0004, ++ 0x7824, 0xd0ac, 0x1148, 0x2001, 0xc96a, 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, 0x3676, 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, ++ 0x35b9, 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, 0x3154, 0x012e, 0x2021, 0x400c, 0x0804, 0x3156, 0xa085, ++ 0x0001, 0x1d04, 0x36e0, 0x2091, 0x6000, 0x8420, 0xa486, 0x0064, ++ 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x0030, 0x2003, ++ 0x0004, 0x2001, 0x0020, 0x2003, 0x0004, 0x2001, 0xc96a, 0x2003, ++ 0x0000, 0x2001, 0xc992, 0x2003, 0x0000, 0x20e1, 0xf000, 0xa026, ++ 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0xc615, 0x200c, 0x7932, ++ 0x7936, 0x080c, 0x29f1, 0x7850, 0xa084, 0x0980, 0xa085, 0x0030, ++ 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0xa084, 0x0980, 0x7852, ++ 0x782c, 0xc0ad, 0x782e, 0x20a9, 0x0046, 0x1d04, 0x3715, 0x2091, ++ 0x6000, 0x1f04, 0x3715, 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, 0x3732, 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, 0xc96a, 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, 0xc907, 0x2004, 0x70e2, 0x2009, 0xc615, ++ 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, 0x387c, ++ 0x080c, 0x36d7, 0x1110, 0x8421, 0x0028, 0x7024, 0xd0bc, 0x0db0, ++ 0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, ++ 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0120, 0x683c, 0x783e, ++ 0x6838, 0x783a, 0x00de, 0x2011, 0x0011, 0x080c, 0x3854, 0x2011, ++ 0x0001, 0x080c, 0x3854, 0x00ee, 0x00fe, 0x7017, 0x0000, 0x00ee, ++ 0x0005, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, 0x7904, ++ 0xd1fc, 0x0904, 0x3851, 0x7803, 0x0002, 0xa026, 0xd19c, 0x1904, ++ 0x384d, 0x7000, 0x0002, 0x3851, 0x380f, 0x3833, 0x384d, 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, 0x377b, 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, ++ 0xc992, 0x2079, 0x0020, 0x7904, 0xd1fc, 0x01f0, 0x7803, 0x0002, ++ 0x2d60, 0xa026, 0x7000, 0x0002, 0x38a4, 0x388f, 0x389b, 0x8001, ++ 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, 0x080c, 0x3854, 0x0160, ++ 0x080c, 0x3854, 0x0048, 0x8001, 0x7002, 0x7804, 0xd0fc, 0x1d30, ++ 0x2011, 0x0001, 0x080c, 0x3854, 0x00ce, 0x00ee, 0x00fe, 0x0005, ++ 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0xc907, 0x2004, ++ 0x601a, 0x2061, 0x0100, 0x2001, 0xc906, 0x2004, 0x60ce, 0x6004, ++ 0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001, 0x0074, 0x2004, 0xa005, ++ 0x01f8, 0x2038, 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c, ++ 0x080c, 0x4026, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, ++ 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, ++ 0x6818, 0xa080, 0x000d, 0x04b1, 0x1d90, 0x2d00, 0x681a, 0x0088, ++ 0x080c, 0x4026, 0x6833, 0x000d, 0x2070, 0x6827, 0x0001, 0x2d00, ++ 0x681a, 0x2001, 0x0076, 0x2004, 0x2072, 0x2001, 0x0077, 0x2004, ++ 0x7006, 0x2061, 0x0020, 0x2079, 0x0100, 0x2001, 0xc906, 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, 0x4026, ++ 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, 0x4026, 0x2d60, 0x6833, 0x000d, 0x6f26, 0x2d00, ++ 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, ++ 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, 0x080c, 0x3912, 0x1d88, ++ 0x2d00, 0x681a, 0x00e0, 0x080c, 0x4026, 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, 0xc96a, 0x2003, ++ 0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x00ee, 0x0005, 0x0804, ++ 0x3154, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xc640, ++ 0x20a0, 0xa006, 0x40a4, 0x012e, 0x0804, 0x3154, 0x7d38, 0x7c3c, ++ 0x0804, 0x31fb, 0x080c, 0x4026, 0x0904, 0x3179, 0x080c, 0x5f22, ++ 0x0110, 0x080c, 0x4f2c, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x080c, 0x4067, 0x701b, 0x39c6, 0x0005, 0xade8, 0x000d, ++ 0x6800, 0xa005, 0x0904, 0x317c, 0x6804, 0xd0ac, 0x0118, 0xd0a4, ++ 0x0904, 0x317c, 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, 0x317c, 0xa288, 0x2f6e, 0x210d, ++ 0xa18c, 0x00ff, 0x615a, 0xd0dc, 0x0130, 0x6828, 0xa08a, 0x007f, ++ 0x1a04, 0x317c, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0a04, 0x317c, ++ 0xa08a, 0x0841, 0x1a04, 0x317c, 0xa084, 0x0007, 0x1904, 0x317c, ++ 0x680c, 0xa005, 0x0904, 0x317c, 0x6810, 0xa005, 0x0904, 0x317c, ++ 0x6848, 0x6940, 0xa10a, 0x1a04, 0x317c, 0x8001, 0x0904, 0x317c, ++ 0x684c, 0x6944, 0xa10a, 0x1a04, 0x317c, 0x8001, 0x0904, 0x317c, ++ 0x6804, 0xd0fc, 0x0560, 0x080c, 0x4026, 0x0904, 0x3179, 0x2009, ++ 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, 0x0038, 0xa399, ++ 0x0000, 0x080c, 0x4067, 0x701b, 0x3a46, 0x0005, 0xade8, 0x000d, ++ 0x20a9, 0x0014, 0x2d98, 0x2069, 0xc66e, 0x2da0, 0x53a3, 0x7010, ++ 0xa0e8, 0x000d, 0x2001, 0xc672, 0x200c, 0xd1e4, 0x0140, 0x00c6, ++ 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, 0x6006, 0x00ce, 0x2009, ++ 0xc8f8, 0x200b, 0x0000, 0x2001, 0xc674, 0x2004, 0xd0ac, 0x0158, ++ 0x7824, 0x200a, 0x2009, 0x017f, 0x200a, 0x3200, 0xa084, 0x003f, ++ 0xa085, 0x3020, 0x2090, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xc652, ++ 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, ++ 0x00ff, 0x6046, 0x080c, 0x61f8, 0x080c, 0x576e, 0x080c, 0x57d7, ++ 0x6000, 0xa086, 0x0000, 0x1904, 0x3b41, 0x6808, 0x602a, 0x080c, ++ 0x25bb, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e, ++ 0x0268, 0x2009, 0x0170, 0x200b, 0x0080, 0xe000, 0xe000, 0x200b, ++ 0x0000, 0x0036, 0x6b08, 0x080c, 0x2a4c, 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, 0xc90d, 0x40a1, 0x080c, 0x707c, 0x6904, ++ 0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000, 0x20a9, 0x0001, 0x6b70, ++ 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, ++ 0x67ed, 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, ++ 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, ++ 0x0010, 0x6003, 0x0001, 0x1f04, 0x3adb, 0x00ce, 0x2069, 0xc652, ++ 0x2001, 0xc8e5, 0x6a80, 0xa294, 0x0030, 0xa28e, 0x0000, 0x0170, ++ 0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020, 0x0140, 0x2003, 0xaaaa, ++ 0x080c, 0x2a95, 0x2001, 0xc8d6, 0x2102, 0x0008, 0x2102, 0x00c6, ++ 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, ++ 0x5f22, 0x0128, 0x080c, 0x440b, 0x0110, 0x080c, 0x2a11, 0x60c8, ++ 0xa005, 0x01d0, 0x6003, 0x0001, 0x2009, 0x3b27, 0x00e0, 0x080c, ++ 0x5f22, 0x1178, 0x2011, 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, ++ 0x080c, 0x7070, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x080c, 0x5e5a, ++ 0x0040, 0x080c, 0x4e5b, 0x0028, 0x6003, 0x0004, 0x2009, 0x3b41, ++ 0x0010, 0x0804, 0x3154, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, ++ 0x0258, 0x2001, 0x0170, 0x2004, 0xa084, 0x00ff, 0xa086, 0x004c, ++ 0x1118, 0x2091, 0x309d, 0x0817, 0x2091, 0x301d, 0x0817, 0x6000, ++ 0xa086, 0x0000, 0x0904, 0x3179, 0x2069, 0xc652, 0x7830, 0x6842, ++ 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0118, 0x2009, 0x0030, 0x0010, ++ 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, ++ 0x406a, 0xa006, 0x080c, 0x2a11, 0x81ff, 0x1904, 0x3179, 0x080c, ++ 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, ++ 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a, ++ 0x0020, 0x080c, 0x4f2c, 0x080c, 0x4e5b, 0x0804, 0x3154, 0x81ff, ++ 0x1904, 0x3179, 0x080c, 0x5f22, 0x1110, 0x0804, 0x3179, 0x6188, ++ 0x81ff, 0x0198, 0x703f, 0x0000, 0x2001, 0xcdc0, 0x2009, 0x0040, ++ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x406a, 0x701b, 0x3152, 0x012e, 0x0005, 0x703f, 0x0001, 0x00d6, ++ 0x2069, 0xcdc0, 0x20a9, 0x0040, 0x20a1, 0xcdc0, 0x2019, 0xffff, ++ 0x43a4, 0x6550, 0xa588, 0x2f6e, 0x210d, 0xa18c, 0x00ff, 0x216a, ++ 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x533d, ++ 0x1190, 0x6014, 0x821c, 0x0238, 0xa398, 0xcdc0, 0xa085, 0xff00, ++ 0x8007, 0x201a, 0x0038, 0xa398, 0xcdc0, 0x2324, 0xa4a4, 0xff00, ++ 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x1208, 0x0c18, ++ 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x00de, 0x20a9, 0x0040, ++ 0x20a1, 0xcdc0, 0x2099, 0xcdc0, 0x080c, 0x4ecb, 0x0804, 0x3b9c, ++ 0x080c, 0x404b, 0x0904, 0x317c, 0x00c6, 0x080c, 0x4026, 0x00ce, ++ 0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x2001, 0xc653, 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, 0xae11, 0x1120, 0x2009, ++ 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3c28, 0x0005, ++ 0x080c, 0x404b, 0x0904, 0x317c, 0x20a9, 0x002b, 0x2c98, 0xade8, ++ 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, ++ 0xad80, 0x0006, 0x20a0, 0x080c, 0x4ecb, 0x20a9, 0x0004, 0xac80, ++ 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c, 0x4ecb, 0x2d00, ++ 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x406a, ++ 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, 0x317c, 0x080c, ++ 0x551a, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x7828, 0xa08a, ++ 0x1000, 0x1a04, 0x317c, 0x080c, 0x404b, 0x0904, 0x317c, 0x080c, ++ 0x557d, 0x0904, 0x3179, 0x2019, 0x0004, 0xa00e, 0x080c, 0x552c, ++ 0x7924, 0x810f, 0x7a28, 0x0011, 0x0804, 0x3154, 0xa186, 0x00ff, ++ 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0xc600, 0x6450, ++ 0x2400, 0xa506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, ++ 0x080c, 0x533d, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, ++ 0x080c, 0x6fb9, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, ++ 0x0904, 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5523, ++ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, ++ 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5511, 0x0804, ++ 0x3154, 0x6100, 0x0804, 0x3154, 0x080c, 0x404b, 0x0904, 0x317c, ++ 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3179, 0x00d6, ++ 0xace8, 0x000a, 0x7924, 0xd184, 0x0110, 0xace8, 0x0006, 0x680c, ++ 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, ++ 0x8217, 0x00de, 0x6100, 0xa18c, 0x0200, 0x0804, 0x3154, 0x7824, ++ 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x1a04, 0x3179, 0x6250, 0xa294, ++ 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, 0xc640, ++ 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x406a, ++ 0x81ff, 0x1904, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, 0x6004, ++ 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x3179, 0x00c6, 0x080c, ++ 0x4026, 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6838, 0xc0fd, ++ 0x683a, 0x080c, 0xadbd, 0x0904, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x3d12, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0xad80, ++ 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, ++ 0x406a, 0xa006, 0x080c, 0x2a11, 0x7824, 0xa084, 0x00ff, 0xa086, ++ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f22, 0x0110, ++ 0x080c, 0x4f2c, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x317c, 0x7924, ++ 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, 0x007f, ++ 0x1a04, 0x317c, 0x2100, 0x080c, 0x29db, 0x0026, 0x00c6, 0x0126, ++ 0x2091, 0x8000, 0x2061, 0xc93a, 0x601b, 0x0000, 0x601f, 0x0000, ++ 0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, ++ 0x5e5a, 0x0420, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, ++ 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, ++ 0x8e79, 0x003e, 0x2061, 0x0100, 0x2001, 0xc615, 0x2004, 0xa084, ++ 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, ++ 0x2009, 0x002d, 0x2011, 0x4e90, 0x080c, 0x7036, 0x7924, 0xa18c, ++ 0xff00, 0x810f, 0x080c, 0x5f22, 0x1110, 0x2009, 0x00ff, 0x7a28, ++ 0x080c, 0x3c76, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3154, 0x7924, ++ 0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x52e1, 0x2c08, 0x00ce, ++ 0x1904, 0x317c, 0x0804, 0x3154, 0x81ff, 0x0120, 0x2009, 0x0001, ++ 0x0804, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, ++ 0x0005, 0x0804, 0x3179, 0x080c, 0x4026, 0x1120, 0x2009, 0x0002, ++ 0x0804, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, ++ 0x4067, 0x701b, 0x3dc4, 0x0005, 0x2009, 0x0080, 0x080c, 0x533d, ++ 0x1130, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, ++ 0x400a, 0x0804, 0x3156, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, ++ 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, ++ 0x3e3b, 0xa0be, 0x0112, 0x0904, 0x3e3b, 0xa0be, 0x0113, 0x0904, ++ 0x3e3b, 0xa0be, 0x0114, 0x0904, 0x3e3b, 0xa0be, 0x0117, 0x0904, ++ 0x3e3b, 0xa0be, 0x011a, 0x0904, 0x3e3b, 0xa0be, 0x011c, 0x0904, ++ 0x3e3b, 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, 0x317c, 0xad80, 0x0010, 0x20a9, ++ 0x0007, 0x080c, 0x3e81, 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c, ++ 0x3e81, 0x0048, 0xad80, 0x000c, 0x080c, 0x3e8f, 0x0050, 0xad80, ++ 0x000e, 0x080c, 0x3e8f, 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c, ++ 0x3e81, 0x00c6, 0x080c, 0x4026, 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, 0xadd9, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x3e78, 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x3179, ++ 0x6820, 0xa086, 0x8001, 0x1904, 0x3154, 0x2009, 0x0004, 0x0804, ++ 0x3179, 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, ++ 0x8108, 0x280a, 0x8108, 0x1f04, 0x3e83, 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, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, ++ 0x2009, 0x0005, 0x0804, 0x3179, 0x7924, 0x2140, 0xa18c, 0xff00, ++ 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x317c, ++ 0xa182, 0x00ff, 0x1a04, 0x317c, 0x7a2c, 0x7b28, 0x6070, 0xa306, ++ 0x1140, 0x6074, 0xa24e, 0x0904, 0x317c, 0xa9cc, 0xff00, 0x0904, ++ 0x317c, 0x00c6, 0x080c, 0x3f6e, 0x2c68, 0x00ce, 0x0538, 0xa0c6, ++ 0x4000, 0x1180, 0x00c6, 0x0006, 0x2d60, 0x2009, 0x0000, 0x080c, ++ 0x55de, 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, 0x3156, 0x2d00, 0x7022, ++ 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x958d, 0x05d8, ++ 0x2d00, 0x601a, 0x080c, 0xb05e, 0x2e58, 0x00ee, 0x00e6, 0x00c6, ++ 0x080c, 0x4026, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x95e3, 0x00ee, ++ 0x00ce, 0x00be, 0x001e, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837, ++ 0x0000, 0x683b, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, ++ 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x2e46, 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, ++ 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x2009, 0x0002, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, ++ 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3f51, ++ 0x0005, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009, ++ 0x0004, 0x6204, 0xa294, 0x00ff, 0x0804, 0x3179, 0x2009, 0x0000, ++ 0x6838, 0xd0f4, 0x1904, 0x3154, 0x080c, 0x55de, 0x1108, 0xc185, ++ 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3154, 0x00e6, 0x00d6, ++ 0x2029, 0x0000, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0138, 0x2021, ++ 0x0000, 0x20a9, 0x00ff, 0x2071, 0xc77b, 0x0030, 0x2021, 0x0080, ++ 0x20a9, 0x007f, 0x2071, 0xc7fb, 0x2e04, 0xa005, 0x1130, 0x2100, ++ 0xa406, 0x15a0, 0x2428, 0xc5fd, 0x0488, 0x2068, 0x6f10, 0x2700, ++ 0xa306, 0x11e0, 0x6e14, 0x2600, 0xa206, 0x11c0, 0x2400, 0xa106, ++ 0x1190, 0x2d60, 0xd884, 0x0598, 0x080c, 0x56ed, 0x1580, 0x2001, ++ 0x4000, 0x0470, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1538, ++ 0x2001, 0x4000, 0x0428, 0x2001, 0x4007, 0x0410, 0x2400, 0xa106, ++ 0x1168, 0x6e14, 0x87ff, 0x1138, 0x86ff, 0x09a0, 0x2001, 0xc635, ++ 0x2004, 0xd0ac, 0x1978, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, ++ 0x1f04, 0x3f84, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, ++ 0x0001, 0x0030, 0x080c, 0x52e1, 0x1dd0, 0x6312, 0x6216, 0xa006, ++ 0xa005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x7824, 0xa005, 0x0904, 0x317c, 0xa096, 0x00ff, 0x0120, 0xa092, ++ 0x0004, 0x1a04, 0x317c, 0x2010, 0x2d18, 0x080c, 0x2df9, 0x0904, ++ 0x3179, 0x7007, 0x0003, 0x701b, 0x3ff6, 0x0005, 0x6830, 0xa086, ++ 0x0100, 0x0904, 0x3179, 0x0804, 0x3154, 0x7924, 0xa18c, 0xff00, ++ 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x317c, ++ 0xa182, 0x00ff, 0x1a04, 0x317c, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0xacc1, 0x1188, 0xa190, 0xc77b, 0x2204, 0xa065, 0x0160, 0x080c, ++ 0x4f47, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, ++ 0x012e, 0x0804, 0x3154, 0x012e, 0x0804, 0x3179, 0x080c, 0x1602, ++ 0x0188, 0xa006, 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, ++ 0x7016, 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, ++ 0xad80, 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, ++ 0x533d, 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, ++ 0xa066, 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, ++ 0x533d, 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, ++ 0x8cff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, ++ 0x080c, 0x1619, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031, ++ 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0xc6f2, 0x6606, 0x6112, ++ 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x164d, ++ 0x7007, 0x0002, 0x701b, 0x3154, 0x0005, 0x00f6, 0x0126, 0x2091, ++ 0x8000, 0x2079, 0x0000, 0x2001, 0xc6b0, 0x2004, 0xa005, 0x1168, ++ 0x0e04, 0x4095, 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, ++ 0x781b, 0x0001, 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, ++ 0x2071, 0xc6a2, 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060, ++ 0x0078, 0x7030, 0xa0e0, 0x0004, 0xac82, 0xc6f2, 0x0210, 0x2061, ++ 0xc6b2, 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, ++ 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, ++ 0x0005, 0x00e6, 0x2071, 0xc6a2, 0x7038, 0xa005, 0x0570, 0x0126, ++ 0x2091, 0x8000, 0x0e04, 0x40ec, 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, 0xc6b2, 0x7037, 0xc6b2, ++ 0x00ce, 0x0048, 0xac80, 0x0004, 0xa0fa, 0xc6f2, 0x0210, 0x2001, ++ 0xc6b2, 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, ++ 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, ++ 0x407d, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3179, 0x0126, 0x2091, ++ 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x5f22, ++ 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, ++ 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0010, ++ 0x080c, 0x4e5b, 0x012e, 0x0804, 0x3154, 0x7824, 0x2008, 0xa18c, ++ 0xfffd, 0x1128, 0x61e0, 0xa10d, 0x61e2, 0x0804, 0x3154, 0x0804, ++ 0x317c, 0x81ff, 0x1904, 0x3179, 0x6000, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x1904, 0x3179, 0x080c, ++ 0x404b, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x1120, 0x7828, 0xa005, 0x0904, 0x3154, 0x00c6, 0x080c, 0x4026, ++ 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x080c, 0xaea2, 0x0904, 0x3179, 0x7007, 0x0003, ++ 0x701b, 0x415b, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, ++ 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4026, ++ 0x0904, 0x3179, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, ++ 0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x533d, ++ 0x1904, 0x41e1, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0148, ++ 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x0120, 0x080c, 0x56ed, 0x1904, ++ 0x41e1, 0xd794, 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, 0x2098, ++ 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3e8f, 0xd794, 0x0148, ++ 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, ++ 0x3e8f, 0xa186, 0x007e, 0x0178, 0xa186, 0x0080, 0x0160, 0x6004, ++ 0xa084, 0x00ff, 0xa0c2, 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c, ++ 0x55de, 0x1108, 0xc1fd, 0x21a2, 0xc1fc, 0xd794, 0x01d8, 0xac80, ++ 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, 0xac80, 0x0003, ++ 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, ++ 0x53a3, 0x080c, 0x3e81, 0xac80, 0x0026, 0x2098, 0x20a9, 0x0002, ++ 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, 0xa6b0, 0x000b, 0xa6b0, ++ 0x0005, 0x8108, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0118, 0xa186, ++ 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, 0x0170, 0x0018, ++ 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, 0xa686, 0x0020, 0x0010, ++ 0xa686, 0x0028, 0x0150, 0x0804, 0x417e, 0x86ff, 0x1120, 0x7120, ++ 0x810b, 0x0804, 0x3154, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, ++ 0x7022, 0x772a, 0x2061, 0xc6f2, 0x6007, 0x0000, 0x6612, 0x7024, ++ 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x164d, ++ 0x7007, 0x0002, 0x701b, 0x421d, 0x0005, 0x702c, 0xa005, 0x1170, ++ 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0xc6f2, ++ 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x417e, 0x7120, 0x810b, ++ 0x0804, 0x3154, 0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, ++ 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, ++ 0x0a04, 0x317c, 0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x317c, ++ 0xa502, 0x0a04, 0x317c, 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, ++ 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, 0xa284, 0x00ff, 0xa0e2, ++ 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, 0xa384, 0xff00, ++ 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, ++ 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, ++ 0x317c, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, ++ 0xa502, 0x0a04, 0x317c, 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0a04, ++ 0x317c, 0xa502, 0x0a04, 0x317c, 0x2061, 0xc900, 0x6102, 0x6206, ++ 0x630a, 0x640e, 0x0804, 0x3154, 0x080c, 0x4026, 0x0904, 0x3179, ++ 0x2009, 0x0020, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4067, ++ 0x701b, 0x429b, 0x0005, 0x0126, 0xade8, 0x000d, 0x2001, 0x0138, ++ 0x2003, 0x0000, 0x00e6, 0x2071, 0xc96a, 0x700c, 0x7110, 0xa106, ++ 0x1de0, 0x00ee, 0x2091, 0x8000, 0x6800, 0xa005, 0x0904, 0x432f, ++ 0x6804, 0x2008, 0xa18c, 0xffe0, 0x1904, 0x432f, 0x680c, 0xa005, ++ 0x0904, 0x432f, 0xa082, 0xff01, 0x1a04, 0x432f, 0x6810, 0xa082, ++ 0x005c, 0x0a04, 0x432f, 0x6824, 0x2008, 0xa082, 0x0008, 0x0a04, ++ 0x432f, 0xa182, 0x0400, 0x1a04, 0x432f, 0x080c, 0x7394, 0x6820, ++ 0x8000, 0x6822, 0x6944, 0x6820, 0xa102, 0x0a04, 0x432f, 0x6828, ++ 0x6944, 0x810c, 0xa102, 0x0a04, 0x432f, 0x6840, 0xa082, 0x000f, ++ 0x1a04, 0x432f, 0x00d6, 0x6848, 0xa005, 0x0148, 0x2008, 0x2069, ++ 0xc600, 0x68e8, 0xa108, 0x68b0, 0xa102, 0x1208, 0x69ea, 0x00de, ++ 0x20a9, 0x0020, 0x2d98, 0x2069, 0xc682, 0x2da0, 0x53a3, 0x00d6, ++ 0x080c, 0x15e5, 0x2d00, 0x00de, 0x0904, 0x4346, 0x684e, 0x080c, ++ 0x725b, 0x05d8, 0x080c, 0x7158, 0x080c, 0x5695, 0x0580, 0x00c6, ++ 0x2061, 0x0100, 0x6104, 0xa18d, 0x8000, 0x6106, 0x610c, 0xa18d, ++ 0x0300, 0xa18c, 0xffbf, 0x610e, 0x2001, 0xc8d4, 0x200c, 0xa18d, ++ 0x0300, 0xa18c, 0xffbf, 0x2102, 0x6b10, 0x2061, 0xc96a, 0x6316, ++ 0x00ce, 0x685f, 0x0000, 0x2001, 0xc696, 0x2003, 0x0000, 0x080c, ++ 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, 0x0804, 0x3154, 0x080c, ++ 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, 0x0804, 0x317c, 0x080c, ++ 0x7475, 0x080c, 0x7484, 0x080c, 0x7147, 0x2001, 0xc695, 0x206c, ++ 0x080c, 0x1619, 0x2001, 0xc695, 0x2003, 0x0000, 0x2001, 0xc63a, ++ 0x2003, 0x0010, 0x080c, 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, ++ 0x0804, 0x3179, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, ++ 0x3179, 0x080c, 0x768f, 0x1904, 0x3179, 0x2001, 0xc8e5, 0x2004, ++ 0xa086, 0xaaaa, 0x0138, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, ++ 0x0904, 0x3170, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x7924, 0x810c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x080c, 0x4067, 0x701b, 0x4380, 0x0005, ++ 0x080c, 0x958d, 0x0904, 0x3179, 0x2001, 0xc8d3, 0x2004, 0x601a, ++ 0x0016, 0x0026, 0x2001, 0xc61c, 0x2004, 0x8007, 0x6934, 0xa105, ++ 0x6836, 0x2001, 0xc61d, 0x2004, 0x8007, 0x683a, 0x002e, 0x001e, ++ 0x2d00, 0x6012, 0x601f, 0x0001, 0x2009, 0x0040, 0x080c, 0x9613, ++ 0x0804, 0x3154, 0x0804, 0x3179, 0x2001, 0xc756, 0x200c, 0xa18e, ++ 0x0000, 0x0904, 0x4402, 0x2001, 0x0101, 0x200c, 0xa18c, 0x7fff, ++ 0x2102, 0x2001, 0x0103, 0x200c, 0xa18c, 0xfeff, 0xa18c, 0xfdff, ++ 0xa18d, 0x0040, 0x2102, 0x2001, 0xc8d4, 0x200c, 0xa18c, 0xfeff, ++ 0xa18c, 0xfdff, 0xa18d, 0x0040, 0x2102, 0x2001, 0x0138, 0x2003, ++ 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x24f3, 0x012e, 0x0128, ++ 0x20a9, 0x006e, 0x1f04, 0x43d2, 0x0ca0, 0x2001, 0xc756, 0x2003, ++ 0x0000, 0x080c, 0x2a95, 0x2001, 0x0138, 0x2102, 0x0126, 0x2091, ++ 0x8000, 0x2001, 0xc695, 0x200c, 0x81ff, 0x0138, 0x2168, 0x080c, ++ 0x1619, 0x2001, 0xc695, 0x2003, 0x0000, 0x2001, 0xc8d3, 0x200c, ++ 0x81ff, 0x0138, 0x2168, 0x080c, 0x1619, 0x2001, 0xc8d3, 0x2003, ++ 0x0000, 0x2001, 0xc63a, 0x2003, 0x0010, 0x080c, 0x7475, 0x080c, ++ 0x7484, 0x012e, 0x0804, 0x3154, 0x7824, 0x00e6, 0x2071, 0xc682, ++ 0x00ee, 0x0804, 0x3154, 0x0006, 0x2001, 0xc653, 0x2004, 0xd0cc, ++ 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, 0xd0bc, 0x000e, ++ 0x0005, 0x6168, 0x7a24, 0x6300, 0x82ff, 0x1118, 0x7926, 0x0804, ++ 0x3154, 0x83ff, 0x1904, 0x317c, 0x2001, 0xfff0, 0xa200, 0x1a04, ++ 0x317c, 0x2019, 0xffff, 0x606c, 0xa302, 0xa200, 0x0a04, 0x317c, ++ 0x7926, 0x626a, 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, ++ 0x0003, 0x1904, 0x3179, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, ++ 0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, ++ 0xc77b, 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, ++ 0x3154, 0x702f, 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, ++ 0xc6f2, 0x6007, 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, ++ 0x662e, 0x6732, 0x2c10, 0x080c, 0x164d, 0x7007, 0x0002, 0x701b, ++ 0x4492, 0x0005, 0x702c, 0xa005, 0x1168, 0x711c, 0x7024, 0x20a0, ++ 0x2019, 0x0000, 0x2061, 0xc6f2, 0x6424, 0x6528, 0x662c, 0x6730, ++ 0x0804, 0x444f, 0x7120, 0x810c, 0x0804, 0x3154, 0x81ff, 0x1904, ++ 0x3179, 0x60d4, 0xd0ac, 0x1118, 0xd09c, 0x0904, 0x3179, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, ++ 0x080c, 0x4067, 0x701b, 0x44bd, 0x0005, 0x00d6, 0xade8, 0x000d, ++ 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100, 0x0130, 0xa0be, ++ 0x7200, 0x0118, 0x00de, 0x0804, 0x317c, 0x6820, 0x6924, 0x080c, ++ 0x29c7, 0x1510, 0x080c, 0x52e1, 0x11f8, 0x7122, 0x6612, 0x6516, ++ 0x6e18, 0x00c6, 0x080c, 0x4026, 0x01b8, 0x080c, 0x4026, 0x01a0, ++ 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, ++ 0x0000, 0x6804, 0x2068, 0x080c, 0xadf5, 0x0904, 0x3179, 0x7007, ++ 0x0003, 0x701b, 0x44f7, 0x0005, 0x00de, 0x0804, 0x3179, 0x7120, ++ 0x080c, 0x2f41, 0x6820, 0xa086, 0x8001, 0x0904, 0x3179, 0x2d00, ++ 0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, ++ 0x20a0, 0x080c, 0x4ecb, 0x000e, 0xade8, 0x000d, 0x6a08, 0x6b0c, ++ 0x6c10, 0x6d14, 0x2061, 0xc6f2, 0x6007, 0x0000, 0x6e00, 0x6f28, ++ 0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, 0x7100, 0x1140, 0xa6c2, ++ 0x0004, 0x0a04, 0x317c, 0x2009, 0x0004, 0x0804, 0x406a, 0xa7c6, ++ 0x7200, 0x1904, 0x317c, 0xa6c2, 0x0054, 0x0a04, 0x317c, 0x600e, ++ 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, ++ 0x164d, 0x7007, 0x0002, 0x701b, 0x453e, 0x0005, 0x701c, 0x2068, ++ 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x0006, 0x20a9, ++ 0x002a, 0x2098, 0x20a0, 0x080c, 0x4ecb, 0x000e, 0x2009, 0x002a, ++ 0x2061, 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x406a, ++ 0x81ff, 0x1904, 0x3179, 0x792c, 0x2001, 0xc8e7, 0x2102, 0x080c, ++ 0x403b, 0x0904, 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x5535, 0x012e, 0x0804, 0x3154, 0x7824, ++ 0xd08c, 0x1118, 0xd084, 0x0904, 0x3bf0, 0x080c, 0x404b, 0x0904, ++ 0x317c, 0x00c6, 0x080c, 0x4026, 0x00ce, 0x1120, 0x2009, 0x0002, ++ 0x0804, 0x3179, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0128, ++ 0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, 0x15b8, 0x7824, 0xd08c, ++ 0x0120, 0x6000, 0xc08c, 0x6002, 0x0030, 0x2001, 0xc653, 0x2004, ++ 0xd0b4, 0x0904, 0x3c2c, 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00, ++ 0x0904, 0x3c2c, 0xa08e, 0x7f00, 0x0904, 0x3c2c, 0xa08e, 0x8000, ++ 0x0904, 0x3c2c, 0x6000, 0xd08c, 0x1904, 0x3c2c, 0x6837, 0x0000, ++ 0x6838, 0xc0fd, 0x683a, 0x080c, 0xae11, 0x1120, 0x2009, 0x0003, ++ 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x45bf, 0x0005, 0x080c, ++ 0x404b, 0x0904, 0x317c, 0x0804, 0x3c2c, 0x2009, 0xc631, 0x210c, ++ 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3179, 0x2001, 0xc600, ++ 0x2004, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, 0x3179, ++ 0x2001, 0xc653, 0x2004, 0xd0ac, 0x0120, 0x2009, 0x0008, 0x0804, ++ 0x3179, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3c2c, 0x6837, ++ 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0xaea2, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x45fa, 0x0005, 0x6830, 0xa086, 0x0100, 0x1120, 0x2009, 0x0004, ++ 0x0804, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, 0x0804, 0x458e, ++ 0x81ff, 0x2009, 0x0001, 0x1904, 0x3179, 0x6000, 0xa086, 0x0003, ++ 0x2009, 0x0007, 0x1904, 0x3179, 0x2001, 0xc653, 0x2004, 0xd0ac, ++ 0x2009, 0x0008, 0x1904, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, ++ 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, ++ 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, 0x2009, 0x0002, 0x0904, ++ 0x3179, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x7928, 0xa194, 0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x1128, ++ 0xc0ed, 0x6952, 0x792c, 0x6956, 0x0048, 0xa28e, 0x0100, 0x1904, ++ 0x317c, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x080c, ++ 0xb05f, 0x2009, 0x0003, 0x0904, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x465a, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, ++ 0x3179, 0x0804, 0x3154, 0x81ff, 0x2009, 0x0001, 0x1904, 0x3179, ++ 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x3179, 0x080c, ++ 0x404b, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x2009, 0x0009, 0x1904, 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, ++ 0x2009, 0x0002, 0x0904, 0x3179, 0xad80, 0x000f, 0x2009, 0x0008, ++ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4067, 0x701b, 0x4691, ++ 0x0005, 0x00d6, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x1140, ++ 0x6804, 0xa005, 0x1128, 0x6808, 0xa084, 0xff00, 0x1108, 0x0018, ++ 0x00de, 0x1904, 0x317c, 0x00de, 0x6837, 0x0000, 0x6833, 0x0000, ++ 0x6838, 0xc0fd, 0x683a, 0x00c6, 0x080c, 0x404b, 0x1118, 0x00ce, ++ 0x0804, 0x317c, 0x080c, 0xb0ae, 0x2009, 0x0003, 0x00ce, 0x0904, ++ 0x3179, 0x7007, 0x0003, 0x701b, 0x46be, 0x0005, 0x6830, 0xa086, ++ 0x0100, 0x2009, 0x0004, 0x0904, 0x3179, 0x0804, 0x3154, 0x81ff, ++ 0x0120, 0x2009, 0x0001, 0x0804, 0x3179, 0x6000, 0xa086, 0x0003, ++ 0x0120, 0x2009, 0x0007, 0x0804, 0x3179, 0x7e24, 0x860f, 0xa18c, ++ 0x00ff, 0xa6b4, 0x00ff, 0x080c, 0x533d, 0x1904, 0x317c, 0xa186, ++ 0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, ++ 0x2009, 0x0009, 0x0804, 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, ++ 0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, 0x680a, 0x080c, 0xae2c, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x470a, 0x0005, 0x6808, 0x8007, 0xa086, 0x0100, 0x1120, 0x2009, ++ 0x0004, 0x0804, 0x3179, 0x68b0, 0x6836, 0x6810, 0x8007, 0xa084, ++ 0x00ff, 0x800c, 0x6814, 0x8007, 0xa084, 0x00ff, 0x8004, 0xa080, ++ 0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, ++ 0x0804, 0x406a, 0x080c, 0x4026, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, ++ 0x0110, 0x0804, 0x317c, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x080c, 0x4067, 0x701b, 0x4746, 0x0005, 0x2001, 0xc62a, ++ 0x2003, 0x0001, 0xad80, 0x000d, 0x2098, 0x20a9, 0x001a, 0x20a1, ++ 0xc90d, 0x53a3, 0x0804, 0x3154, 0x080c, 0x4026, 0x1120, 0x2009, ++ 0x0002, 0x0804, 0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, ++ 0x8217, 0x82ff, 0x0110, 0x0804, 0x317c, 0x2099, 0xc90d, 0x20a0, ++ 0x20a9, 0x001a, 0x53a3, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x0804, 0x406a, 0x7824, 0xa08a, 0x1000, 0x1a04, 0x317c, ++ 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0xa108, 0x00c6, ++ 0x2061, 0xc93a, 0x6142, 0x00ce, 0x012e, 0x0804, 0x3154, 0x00c6, ++ 0x080c, 0x5f22, 0x1188, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, ++ 0x5e5a, 0x080c, 0x1519, 0x0038, 0x2061, 0xc600, 0x6030, 0xc09d, ++ 0x6032, 0x080c, 0x4e5b, 0x00ce, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x00c6, 0x2061, 0xc93a, 0x7924, 0x6152, 0x614e, 0x6057, 0x0000, ++ 0x604b, 0x0009, 0x7838, 0x606a, 0x783c, 0x6066, 0x7828, 0x6062, ++ 0x782c, 0x605e, 0x2061, 0xc8e8, 0x2001, 0xc94f, 0x600e, 0x6013, ++ 0x0001, 0x6017, 0x0002, 0x6007, 0x0000, 0x6037, 0x0000, 0x00ce, ++ 0x012e, 0x0804, 0x3154, 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100, ++ 0x2071, 0xc600, 0x6044, 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c, ++ 0x4942, 0x0068, 0xd08c, 0x0118, 0x080c, 0x4863, 0x0040, 0xd094, ++ 0x0118, 0x080c, 0x4834, 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, 0x4eeb, 0x00f0, 0x6040, 0xa084, 0x0010, ++ 0xa085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707b, 0x0000, 0x7097, ++ 0x0001, 0x70bb, 0x0000, 0x70d7, 0x0000, 0x2009, 0xcdc0, 0x200b, ++ 0x0000, 0x708b, 0x0000, 0x707f, 0x000a, 0x2009, 0x000a, 0x2011, ++ 0x4e11, 0x080c, 0x7036, 0x0005, 0x0156, 0x2001, 0xc674, 0x2004, ++ 0xd08c, 0x0110, 0x7053, 0xffff, 0x707c, 0xa005, 0x1510, 0x2011, ++ 0x4e11, 0x080c, 0x6fad, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, ++ 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x484b, ++ 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, 0x1519, 0x0005, 0x486f, 0x48bf, 0x4941, 0x00f6, ++ 0x7083, 0x0001, 0x20e1, 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c, ++ 0x25bb, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079, 0xcc00, 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, ++ 0xcc0c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099, 0xc605, 0x20a1, ++ 0xcc0e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0xcc12, 0x207b, 0x0000, ++ 0x7807, 0x0000, 0x2099, 0xcc00, 0x20a1, 0x020b, 0x20a9, 0x0014, ++ 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x4e42, 0x00fe, ++ 0x7087, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6, ++ 0x7084, 0x7087, 0x0000, 0xa025, 0x0904, 0x4929, 0x6020, 0xd0b4, ++ 0x1904, 0x4927, 0x7194, 0x81ff, 0x0904, 0x4917, 0xa486, 0x000c, ++ 0x1904, 0x4922, 0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, 0xcc80, ++ 0x2019, 0xcc00, 0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318, ++ 0x1f04, 0x48da, 0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, ++ 0x6043, 0x0006, 0x7083, 0x0002, 0x708f, 0x0002, 0x2009, 0x07d0, ++ 0x2011, 0x4e18, 0x080c, 0x7036, 0x0490, 0x2069, 0xcc80, 0x6930, ++ 0xa18e, 0x1101, 0x1538, 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c, ++ 0x00ff, 0x1118, 0x6804, 0xa005, 0x0190, 0x2011, 0xcc8e, 0x2019, ++ 0xc605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0230, 0x1190, ++ 0x8210, 0x8318, 0x1f04, 0x490b, 0x0068, 0x7097, 0x0000, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, ++ 0x0014, 0x53a6, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00de, ++ 0x0005, 0x6040, 0xa085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, ++ 0x60c3, 0x000c, 0x2011, 0xc931, 0x2013, 0x0000, 0x7087, 0x0000, ++ 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8bec, ++ 0x0c30, 0x0005, 0x708c, 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010, ++ 0x080c, 0x1519, 0x0005, 0x4975, 0x4984, 0x49ac, 0x49c5, 0x49e9, ++ 0x4a11, 0x4a35, 0x4a66, 0x4a8a, 0x4ab2, 0x4ae9, 0x4b11, 0x4b2d, ++ 0x4b43, 0x4b63, 0x4b76, 0x4b7e, 0x4bae, 0x4bd2, 0x4bfa, 0x4c1e, ++ 0x4c4f, 0x4c8c, 0x4cbb, 0x4cd7, 0x4d16, 0x4d36, 0x4d4f, 0x4d50, ++ 0x00c6, 0x2061, 0xc600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, ++ 0xa084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f, ++ 0xf0f0, 0x6043, 0x0002, 0x708f, 0x0001, 0x2009, 0x07d0, 0x2011, ++ 0x4e18, 0x080c, 0x7036, 0x0005, 0x00f6, 0x7084, 0xa086, 0x0014, ++ 0x1508, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xcc80, ++ 0x7a30, 0xa296, 0x1102, 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38, ++ 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0x708f, 0x0010, 0x080c, 0x4b7e, 0x0010, ++ 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0003, 0x6043, 0x0004, ++ 0x2011, 0x4e18, 0x080c, 0x6fad, 0x080c, 0x4ed3, 0x20a3, 0x1102, ++ 0x20a3, 0x0000, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x49bc, ++ 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, ++ 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, 0x11a8, ++ 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1102, 0x1178, 0x7834, 0xa005, ++ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, ++ 0x0001, 0x708f, 0x0004, 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, ++ 0x0005, 0x708f, 0x0005, 0x080c, 0x4ed3, 0x20a3, 0x1103, 0x20a3, ++ 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f24, 0x1160, 0x7078, ++ 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4ddc, ++ 0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, ++ 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, ++ 0x6fad, 0xa086, 0x0014, 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, ++ 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, ++ 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0006, 0x0029, ++ 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0007, 0x080c, ++ 0x4ed3, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, ++ 0x080c, 0x4f24, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, ++ 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00, 0x810f, ++ 0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c, 0x2a11, ++ 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, ++ 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, ++ 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, ++ 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, ++ 0x70bb, 0x0001, 0x708f, 0x0008, 0x0029, 0x0010, 0x080c, 0x4e5b, ++ 0x00fe, 0x0005, 0x708f, 0x0009, 0x080c, 0x4ed3, 0x20a3, 0x1105, ++ 0x20a3, 0x0100, 0x3430, 0x080c, 0x4f24, 0x1150, 0x7078, 0xa005, ++ 0x1138, 0x080c, 0x4d51, 0x1170, 0xa085, 0x0001, 0x080c, 0x2a11, ++ 0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0010, 0x080c, ++ 0x4968, 0x0005, 0x00f6, 0x7084, 0xa005, 0x0588, 0x2011, 0x4e18, ++ 0x080c, 0x6fad, 0xa086, 0x0014, 0x1540, 0x2079, 0xcc80, 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, 0x4b63, 0x0010, 0x080c, 0x4e5b, 0x00fe, ++ 0x0005, 0x708f, 0x000b, 0x2011, 0xcc0e, 0x22a0, 0x20a9, 0x0040, ++ 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4, ++ 0x080c, 0x4ed3, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, 0x4f24, ++ 0x0118, 0x2013, 0x0000, 0x0020, 0x7054, 0xa085, 0x0100, 0x2012, ++ 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4e42, ++ 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4e18, 0x080c, ++ 0x6fad, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80, 0x7a30, 0xa296, ++ 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x000c, 0x0029, ++ 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x000d, 0x080c, ++ 0x4ed3, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, 0xcc8e, 0x20a9, ++ 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, ++ 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, 0x1188, 0x2079, 0xcc80, ++ 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, ++ 0x0001, 0x080c, 0x4ec5, 0x708f, 0x000e, 0x0029, 0x0010, 0x080c, ++ 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x000f, 0x7087, 0x0000, 0x608b, ++ 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, ++ 0x07d0, 0x2011, 0x4e18, 0x080c, 0x6fa1, 0x0005, 0x7084, 0xa005, ++ 0x0120, 0x2011, 0x4e18, 0x080c, 0x6fad, 0x0005, 0x708f, 0x0011, ++ 0x080c, 0x4f24, 0x11a0, 0x7170, 0x81ff, 0x0188, 0x2009, 0x0000, ++ 0x7074, 0xa084, 0x00ff, 0x080c, 0x29c7, 0xa186, 0x007e, 0x0138, ++ 0xa186, 0x0080, 0x0120, 0x2011, 0xcc8e, 0x080c, 0x4ddc, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x7484, ++ 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, ++ 0x53a6, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, ++ 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, ++ 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, ++ 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, ++ 0x70bb, 0x0001, 0x708f, 0x0012, 0x0029, 0x0010, 0x080c, 0x4e5b, ++ 0x00fe, 0x0005, 0x708f, 0x0013, 0x080c, 0x4edf, 0x20a3, 0x1103, ++ 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f24, 0x1160, ++ 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, ++ 0x4ddc, 0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0, ++ 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, ++ 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e18, ++ 0x080c, 0x6fad, 0xa086, 0x0014, 0x11a8, 0x2079, 0xcc80, 0x7a30, ++ 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, ++ 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0014, ++ 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0015, ++ 0x080c, 0x4edf, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, ++ 0xcc8e, 0x080c, 0x4f24, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, ++ 0xa186, 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00, ++ 0x810f, 0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c, ++ 0x2a11, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, ++ 0x7084, 0xa005, 0x05b8, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, ++ 0x0014, 0x1570, 0x2079, 0xcc80, 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, 0xc674, 0x2004, ++ 0xd0a4, 0x1110, 0x70d7, 0x0008, 0x708f, 0x0016, 0x0029, 0x0010, ++ 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, ++ 0x2011, 0xcc8e, 0x708f, 0x0017, 0x080c, 0x4f24, 0x1150, 0x7078, ++ 0xa005, 0x1138, 0x080c, 0x4d51, 0x1170, 0xa085, 0x0001, 0x080c, ++ 0x2a11, 0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0010, ++ 0x080c, 0x4968, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80, ++ 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, ++ 0x0018, 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, ++ 0x0019, 0x080c, 0x4edf, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, ++ 0x2099, 0xcc8e, 0x2039, 0xcc0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, ++ 0x080c, 0x4f24, 0x11e8, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, ++ 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x7054, ++ 0x2310, 0x8214, 0xa2a0, 0xcc0e, 0x2414, 0xa38c, 0x0001, 0x0118, ++ 0xa294, 0xff00, 0x0018, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, ++ 0x2798, 0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x60c3, 0x0084, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, ++ 0xa005, 0x01d0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, ++ 0x1188, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, ++ 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4ec5, 0x708f, 0x001a, ++ 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x001b, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, ++ 0x7484, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, ++ 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4e42, 0x0005, 0x0005, ++ 0x0005, 0x0086, 0x0096, 0x2029, 0xc653, 0x252c, 0x20a9, 0x0008, ++ 0x2041, 0xcc0e, 0x28a0, 0x2099, 0xcc8e, 0x53a3, 0x20a9, 0x0008, ++ 0x2011, 0x0007, 0xd5d4, 0x0110, 0x2011, 0x0000, 0x2800, 0xa200, ++ 0x200c, 0xa1a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, ++ 0x8211, 0x1f04, 0x4d66, 0x0804, 0x4dd4, 0x82ff, 0x1160, 0xd5d4, ++ 0x0120, 0xa1a6, 0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904, ++ 0x4dd4, 0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, ++ 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, ++ 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, ++ 0x4d8c, 0x04d0, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, ++ 0x4d9e, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039, ++ 0x0007, 0x2200, 0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04, ++ 0x4dad, 0x7552, 0xa5c8, 0x2f6e, 0x292d, 0xa5ac, 0x00ff, 0x7576, ++ 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x29f1, 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, ++ 0x1519, 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, 0x2f6e, 0x242d, 0xa5ac, ++ 0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x29f1, ++ 0x001e, 0x60e7, 0x0000, 0x65ea, 0x707b, 0x0001, 0xa084, 0x0000, ++ 0x0005, 0x00e6, 0x2071, 0xc600, 0x707f, 0x0000, 0x00ee, 0x0005, ++ 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x8bf5, ++ 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0xc623, 0x2073, 0x0000, 0x7840, ++ 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x001e, 0xa094, ++ 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, ++ 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011, 0xc931, 0x2013, ++ 0x0000, 0x7087, 0x0000, 0x012e, 0x20e1, 0x9080, 0x60a3, 0x0056, ++ 0x60a7, 0x9575, 0x080c, 0x8bec, 0x2009, 0x07d0, 0x2011, 0x4e18, ++ 0x080c, 0x7036, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, ++ 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, 0x8e79, ++ 0x003e, 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x2061, 0xc93a, 0x601b, ++ 0x0000, 0x601f, 0x0000, 0x2061, 0xc600, 0x6003, 0x0001, 0x2061, ++ 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, ++ 0x4e90, 0x080c, 0x6fa1, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, ++ 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x0100, 0x080c, ++ 0x8bf5, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, ++ 0x1000, 0x7003, 0x0000, 0x080c, 0x5f2a, 0x01a8, 0x080c, 0x5f48, ++ 0x1190, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0016, 0x080c, 0x2a95, ++ 0x2001, 0xc8d6, 0x2102, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0000, ++ 0x080c, 0x5e5a, 0x0030, 0x2001, 0x0001, 0x080c, 0x296d, 0x080c, ++ 0x4e5b, 0x012e, 0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1, ++ 0xcdc0, 0x2099, 0xcc8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, ++ 0x1f04, 0x4ecb, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, ++ 0xcc00, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, ++ 0x000c, 0x53a6, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, ++ 0x2001, 0xc631, 0x2004, 0xa005, 0x1138, 0x2001, 0xc615, 0x2004, ++ 0xa084, 0x00ff, 0xa105, 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e, ++ 0x00ce, 0x0005, 0x0016, 0x0046, 0x2001, 0xc653, 0x2004, 0xd0a4, ++ 0x0158, 0xa006, 0x2020, 0x2009, 0x002a, 0x080c, 0xc190, 0x2001, ++ 0xc60c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, ++ 0x080c, 0x2e19, 0x004e, 0x001e, 0x0005, 0x080c, 0x4e5b, 0x708f, ++ 0x0000, 0x7087, 0x0000, 0x0005, 0x0006, 0x2001, 0xc60c, 0x2004, ++ 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, ++ 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e, ++ 0x001e, 0x000e, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009, 0xc77b, ++ 0xa006, 0x200a, 0x8108, 0x1f04, 0x4f41, 0x015e, 0x0005, 0x00d6, ++ 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0xc652, 0xa006, 0x6002, ++ 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2f6e, 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, 0x60be, 0x61a2, ++ 0x00d6, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x1619, 0x60a7, 0x0000, ++ 0x60a8, 0xa06d, 0x0110, 0x080c, 0x1619, 0x60ab, 0x0000, 0x00de, ++ 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0xa006, 0x60b2, ++ 0x60ae, 0x60b6, 0x60bb, 0x0520, 0x6814, 0xa084, 0x00ff, 0x6042, ++ 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x1a04, ++ 0x505c, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x5061, ++ 0x2001, 0xc60c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xc60c, ++ 0x2004, 0xd084, 0x1904, 0x5044, 0xa188, 0xc77b, 0x2104, 0xa065, ++ 0x0904, 0x5044, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, ++ 0x5044, 0x6000, 0xd0c4, 0x0904, 0x5044, 0x0068, 0xa188, 0xc77b, ++ 0x2104, 0xa065, 0x0904, 0x5028, 0x6004, 0xa084, 0x00ff, 0xa08e, ++ 0x0006, 0x1904, 0x502d, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x5568, ++ 0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x55b3, 0x1170, 0x694c, ++ 0xd1fc, 0x1118, 0x080c, 0x5272, 0x0448, 0x080c, 0x5221, 0x694c, ++ 0xd1ec, 0x1520, 0x080c, 0x545a, 0x0408, 0x694c, 0xa184, 0xa000, ++ 0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5469, 0x0028, ++ 0x080c, 0x5469, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x5221, 0x0070, ++ 0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, ++ 0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x79b6, ++ 0xa006, 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8, ++ 0x2001, 0x0028, 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148, ++ 0x6100, 0xd1fc, 0x0904, 0x4fe3, 0x2001, 0x0029, 0x2009, 0x1000, ++ 0x0420, 0x2001, 0x0028, 0x00a8, 0x2009, 0xc60c, 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, 0xa084, 0xff00, 0xa08e, ++ 0xff00, 0x1120, 0x2001, 0xc8d3, 0x2064, 0x0080, 0x6844, 0x8007, ++ 0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, 0x1698, 0xa188, 0xc77b, ++ 0x2104, 0xa065, 0x01d8, 0x080c, 0x56ed, 0x11d8, 0x2c70, 0x080c, ++ 0x958d, 0x0568, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x601f, 0x0009, ++ 0x600b, 0x0000, 0x6844, 0xa08e, 0xff00, 0x1110, 0x600b, 0x8000, ++ 0x2009, 0x0100, 0x080c, 0x9613, 0xa006, 0x00b0, 0x2001, 0x0028, ++ 0x0090, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, ++ 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, ++ 0x0010, 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee, 0x0005, 0x2001, ++ 0x002c, 0x0cc8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0x8007, ++ 0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, 0x1a04, 0x510d, 0xa188, ++ 0xc77b, 0x2104, 0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e, ++ 0x0006, 0x11a8, 0x2c70, 0x080c, 0x958d, 0x05e8, 0x2e00, 0x601a, ++ 0x2d00, 0x6012, 0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, ++ 0x080c, 0x9613, 0xa006, 0x0460, 0x2001, 0x0028, 0x0440, 0xa082, ++ 0x0006, 0x1298, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1158, 0x60a0, ++ 0xd0bc, 0x1140, 0x6100, 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009, ++ 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0xc60c, 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, 0xc600, 0x6944, ++ 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x51d8, 0x080c, ++ 0x533d, 0x11a0, 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x1270, ++ 0x6864, 0xa0c6, 0x006f, 0x0150, 0x2001, 0xc635, 0x2004, 0xd0ac, ++ 0x1904, 0x51c1, 0x60a0, 0xd0bc, 0x1904, 0x51c1, 0x6864, 0xa0c6, ++ 0x006f, 0x0118, 0x2008, 0x0804, 0x518a, 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, 0x3f6e, 0x2c70, 0x0550, ++ 0x2009, 0x0000, 0x2011, 0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, ++ 0x2e60, 0x080c, 0x55de, 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, 0x958d, 0x1138, 0x2001, 0x4005, 0x2009, ++ 0x0003, 0x2011, 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, 0xb05e, ++ 0x2d00, 0x6012, 0x601f, 0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5, ++ 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e46, 0x012e, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x2009, ++ 0x0002, 0x080c, 0x9613, 0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, ++ 0x0005, 0x2001, 0x0028, 0x2009, 0x0000, 0x0cb0, 0x2009, 0xc60c, ++ 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, 0xc77b, 0x2104, 0xa065, 0x01b8, 0x6004, ++ 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, ++ 0x080c, 0x5469, 0x0431, 0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110, ++ 0x080c, 0x545a, 0x080c, 0x54a7, 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, 0xc927, 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, ++ 0xc653, 0x2004, 0xd0a4, 0x0140, 0xa284, 0xff00, 0x8007, 0xa086, ++ 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0xa294, 0xff00, 0xa215, ++ 0x6206, 0x0006, 0xa086, 0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, ++ 0x080c, 0x1519, 0x000e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, ++ 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006, ++ 0x1178, 0x609c, 0xd0a4, 0x0160, 0x2001, 0xc653, 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, 0xc77b, 0x2204, 0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, ++ 0x15e5, 0x2d60, 0x00de, 0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, ++ 0x0000, 0x60ab, 0x0000, 0x080c, 0x4f47, 0xa006, 0x002e, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, ++ 0x0001, 0x0480, 0x00d6, 0xa190, 0xc77b, 0x2204, 0xa06d, 0x0540, ++ 0x2013, 0x0000, 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, ++ 0x080c, 0x1619, 0x60a8, 0xa06d, 0x0110, 0x080c, 0x1619, 0x00ce, ++ 0x00de, 0x00d6, 0x00c6, 0x68bc, 0x2060, 0x8cff, 0x0168, 0x600c, ++ 0x0006, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, 0x1629, ++ 0x080c, 0x95e3, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x080c, 0x1619, ++ 0x00de, 0xa006, 0x002e, 0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, ++ 0x0218, 0xa085, 0x0001, 0x0030, 0xa188, 0xc77b, 0x2104, 0xa065, ++ 0x0dc0, 0xa006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, ++ 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, ++ 0x5f22, 0x1558, 0x60a0, 0xa086, 0x007e, 0x2069, 0xcc90, 0x0130, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4, ++ 0x01e0, 0x00d6, 0x2069, 0xcc8e, 0x00c6, 0x2061, 0xc8f9, 0x6810, ++ 0x2062, 0x6814, 0x6006, 0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, ++ 0x00de, 0x8d69, 0x2d04, 0x2069, 0x0140, 0xa005, 0x1110, 0x2001, ++ 0x0001, 0x6886, 0x2069, 0xc600, 0x68a6, 0x2069, 0xcc8e, 0x6808, ++ 0x605e, 0x6810, 0x6062, 0x6138, 0xa10a, 0x0208, 0x603a, 0x6814, ++ 0x6066, 0x2099, 0xcc96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, ++ 0x53a3, 0x2099, 0xcc9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, ++ 0x53a3, 0x2069, 0xccae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, ++ 0x6072, 0x6818, 0x6076, 0x60a0, 0xa086, 0x007e, 0x1120, 0x2069, ++ 0xcc8e, 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, 0xcc8d, 0x2e04, 0x6896, 0x2071, 0xcc8e, ++ 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009, 0xc672, 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, 0x5415, 0x080c, 0x1519, 0x260a, 0x8210, ++ 0x6a06, 0x0098, 0x080c, 0x1602, 0x01a8, 0x2d00, 0x60a6, 0x6803, ++ 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, ++ 0x1f04, 0x542d, 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x012e, ++ 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, ++ 0x60a4, 0xa00d, 0x01a0, 0x2168, 0x6800, 0xa005, 0x1160, 0x080c, ++ 0x5568, 0x1168, 0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, 0x0218, ++ 0x8001, 0x6806, 0x0020, 0x080c, 0x1619, 0x60a7, 0x0000, 0x00de, ++ 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x55c6, 0x0010, ++ 0x080c, 0x5221, 0x080c, 0x54e0, 0x1dd8, 0x080c, 0x54a7, 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, 0x547b, 0x080c, 0x1519, 0x260a, 0x8210, 0x6a56, 0x0098, ++ 0x080c, 0x1602, 0x01d0, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, ++ 0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5493, ++ 0x6857, 0x0001, 0x6e62, 0x0010, 0x080c, 0x5272, 0x0089, 0x1de0, ++ 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x79b6, 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, 0x8fb7, 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, 0x5562, ++ 0x1110, 0x2011, 0x0001, 0x080c, 0x55ad, 0x1110, 0xa295, 0x0002, ++ 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad46, 0x0010, 0xa085, ++ 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xacd6, 0x0010, ++ 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad29, ++ 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, ++ 0xacf2, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, ++ 0x080c, 0xad62, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, 0x0006, ++ 0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, ++ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xaf03, 0x0006, ++ 0x6000, 0xd0fc, 0x0110, 0x080c, 0xc4e0, 0x000e, 0x080c, 0x580a, ++ 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, 0x5571, 0xa085, ++ 0x0001, 0x0008, 0xa006, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, ++ 0x8000, 0x60a4, 0xa06d, 0x1128, 0x080c, 0x1602, 0x01a0, 0x2d00, ++ 0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, ++ 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5591, 0xa085, 0x0001, ++ 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, ++ 0x8000, 0x60a4, 0xa06d, 0x0130, 0x60a7, 0x0000, 0x080c, 0x1619, ++ 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, 0x55bc, 0xa085, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x0c19, 0x1188, 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, ++ 0x6854, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6856, 0x0020, 0x080c, ++ 0x1619, 0x60ab, 0x0000, 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, ++ 0x0005, 0x00f6, 0x080c, 0x5f22, 0x01b0, 0x71b8, 0x81ff, 0x1198, ++ 0x71d4, 0xd19c, 0x0180, 0x2001, 0x007e, 0xa080, 0xc77b, 0x2004, ++ 0xa07d, 0x0148, 0x7804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, ++ 0x7800, 0xc0ed, 0x7802, 0x2079, 0xc652, 0x7804, 0xd0a4, 0x01e8, ++ 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, ++ 0x533d, 0x1168, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, ++ 0x0118, 0xa086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, ++ 0x8108, 0x1f04, 0x5606, 0x00ce, 0x015e, 0x080c, 0x570b, 0x0120, ++ 0x2001, 0xc8fc, 0x200c, 0x0038, 0x2079, 0xc652, 0x7804, 0xd0a4, ++ 0x0130, 0x2009, 0x07d0, 0x2011, 0x5631, 0x080c, 0x7036, 0x00fe, ++ 0x0005, 0x2011, 0x5631, 0x080c, 0x6fad, 0x080c, 0x570b, 0x01f0, ++ 0x2001, 0xc7f9, 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, ++ 0x5631, 0x080c, 0x7036, 0x00e6, 0x2071, 0xc600, 0x7073, 0x0000, ++ 0x7077, 0x0000, 0x080c, 0x2c62, 0x00ee, 0x04b0, 0x0156, 0x00c6, ++ 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1530, ++ 0x6000, 0xd0ec, 0x0518, 0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, ++ 0xa006, 0x2009, 0x0029, 0x080c, 0xc190, 0x6000, 0xc0e5, 0xc0ec, ++ 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, ++ 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, ++ 0x2009, 0x0000, 0x080c, 0xbef7, 0x007e, 0x004e, 0x001e, 0x8108, ++ 0x1f04, 0x565c, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, ++ 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x080c, ++ 0x15e5, 0x2d60, 0x0508, 0x2009, 0x00ff, 0x60a7, 0x0000, 0x60ab, ++ 0x0000, 0x080c, 0x4f47, 0x6007, 0x0006, 0x6013, 0x00ff, 0x6017, ++ 0xffff, 0x606f, 0x0200, 0x606c, 0x6093, 0x0002, 0x60bb, 0x0520, ++ 0x60a3, 0x00ff, 0x60b7, 0x0000, 0x60af, 0x0000, 0x2c08, 0x2001, ++ 0xc8d3, 0x2102, 0xa085, 0x0001, 0x00de, 0x00ce, 0x0005, 0x7818, ++ 0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004, 0xd0bc, 0x0005, 0x0156, ++ 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x20a9, 0x00ff, 0x2009, 0x0000, ++ 0x0016, 0x080c, 0x533d, 0x1178, 0x2c70, 0x70ac, 0xa005, 0x0158, ++ 0x2060, 0x620c, 0x0026, 0x6010, 0x2068, 0x080c, 0x761a, 0x002e, ++ 0x2260, 0x82ff, 0x1db0, 0x001e, 0x8108, 0x1f04, 0x56d0, 0x002e, ++ 0x00ce, 0x00de, 0x00ee, 0x015e, 0x0005, 0x0006, 0x0016, 0x0026, ++ 0x6004, 0xa08c, 0x00ff, 0xa196, 0x0006, 0x0188, 0xa196, 0x0004, ++ 0x0170, 0xa196, 0x0005, 0x0158, 0xa08c, 0xff00, 0x810f, 0xa196, ++ 0x0006, 0x0128, 0xa196, 0x0004, 0x0110, 0xa196, 0x0005, 0x002e, ++ 0x001e, 0x000e, 0x0005, 0x00f6, 0x2001, 0xc7f9, 0x2004, 0xa07d, ++ 0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, ++ 0x8000, 0x0006, 0x62a0, 0xa290, 0xc77b, 0x2204, 0xac06, 0x190c, ++ 0x1519, 0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, ++ 0x6202, 0x002e, 0x012e, 0x0005, 0x2011, 0xc635, 0x2204, 0xd0cc, ++ 0x0138, 0x2001, 0xc8fa, 0x200c, 0x2011, 0x5739, 0x080c, 0x7036, ++ 0x0005, 0x2011, 0x5739, 0x080c, 0x6fad, 0x2011, 0xc635, 0x2204, ++ 0xc0cc, 0x2012, 0x0005, 0x2071, 0xc734, 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, 0xc8c3, 0x7003, ++ 0xc734, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xc8a3, 0x7013, ++ 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, ++ 0x2071, 0xc87b, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, ++ 0xc653, 0x2004, 0xd0fc, 0x1150, 0x2001, 0xc653, 0x2004, 0xa00e, ++ 0xd09c, 0x0108, 0x8108, 0x7102, 0x0804, 0x57d4, 0x2001, 0xc672, ++ 0x200c, 0xa184, 0x000f, 0x2009, 0xc673, 0x210c, 0x0002, 0x577c, ++ 0x57af, 0x57b6, 0x57c0, 0x57c5, 0x577c, 0x577c, 0x577c, 0x579f, ++ 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x7003, ++ 0x0004, 0x0136, 0x0146, 0x0156, 0x2099, 0xc676, 0x20a1, 0xc8cc, ++ 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, 0xc734, 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, ++ 0x5863, 0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xc600, 0xa016, ++ 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, ++ 0x702e, 0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xc734, 0x701c, ++ 0xa005, 0x1904, 0x5873, 0x20a9, 0x0032, 0x0f04, 0x5871, 0x0e04, ++ 0x582d, 0x2071, 0xc87b, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, ++ 0x0103, 0x1904, 0x5881, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, ++ 0x8020, 0x2200, 0x0002, 0x5871, 0x5848, 0x58e8, 0x58f5, 0x5871, ++ 0x2071, 0x0000, 0x20a9, 0x0032, 0x0f04, 0x5871, 0x7018, 0xd084, ++ 0x1dd8, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, ++ 0x2091, 0x4080, 0x2071, 0xc600, 0x702c, 0x206a, 0x2d00, 0x702e, ++ 0x70b4, 0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, ++ 0xa086, 0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, ++ 0x0880, 0x2071, 0xc734, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, ++ 0x7012, 0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, ++ 0x0c10, 0xa18c, 0x00ff, 0xa186, 0x0013, 0x01e0, 0xa186, 0x001b, ++ 0x01c8, 0xa186, 0x0023, 0x01e8, 0xa186, 0x0017, 0x0130, 0xa186, ++ 0x001e, 0x0118, 0xa18e, 0x001f, 0x19e0, 0x684c, 0xd0cc, 0x09c8, ++ 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1998, 0x2009, 0x8021, ++ 0x0804, 0x5841, 0x6848, 0xa005, 0x1960, 0x2009, 0x8022, 0x0804, ++ 0x5841, 0x2071, 0x0000, 0x7018, 0xd084, 0x1918, 0x00e6, 0x2071, ++ 0xc682, 0x7140, 0x00ee, 0x6838, 0xa102, 0x0a04, 0x5871, 0x684c, ++ 0xa005, 0x1158, 0x00e6, 0x2071, 0xc682, 0x7004, 0x00ee, 0xd08c, ++ 0x1904, 0x5871, 0x2001, 0x8024, 0x0040, 0x6848, 0xd084, 0x1118, ++ 0x2001, 0x8023, 0x0010, 0x2001, 0x8027, 0x7022, 0x6840, 0x7026, ++ 0x683c, 0x702a, 0x6850, 0x702e, 0x0026, 0x0036, 0x6b38, 0x2e10, ++ 0xa290, 0x0072, 0x2d00, 0xa080, 0x0015, 0x200c, 0x2112, 0x8000, ++ 0x200c, 0x8210, 0x8319, 0x1dd0, 0x003e, 0x002e, 0x0804, 0x5856, ++ 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x5871, 0x7186, 0xae90, ++ 0x0003, 0xa210, 0x683c, 0x2012, 0x0080, 0x7084, 0x8008, 0xa092, ++ 0x000f, 0x1a04, 0x5871, 0x7186, 0xae90, 0x0003, 0x8003, 0xa210, ++ 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04, ++ 0x585a, 0x718c, 0x7084, 0xa10a, 0x0a04, 0x585a, 0x2071, 0x0000, ++ 0x7018, 0xd084, 0x1904, 0x585a, 0x2071, 0xc87b, 0x7000, 0xa086, ++ 0x0002, 0x1150, 0x080c, 0x5b75, 0x2071, 0x0000, 0x701b, 0x0001, ++ 0x2091, 0x4080, 0x0804, 0x585a, 0x080c, 0x5b9f, 0x2071, 0x0000, ++ 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x585a, 0x0006, 0x684c, ++ 0x0006, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, ++ 0x2001, 0x0000, 0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, ++ 0x684a, 0x6952, 0x0005, 0x2071, 0xc734, 0x7004, 0x0002, 0x5951, ++ 0x5962, 0x5b60, 0x5b61, 0x5b6e, 0x5b74, 0x5952, 0x5b51, 0x5ae7, ++ 0x5b3d, 0x0005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5961, 0x2009, ++ 0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, ++ 0x0000, 0x012e, 0x2069, 0xc93a, 0x683c, 0xa005, 0x03f8, 0x11f0, ++ 0x0126, 0x2091, 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xc740, ++ 0x2004, 0xa10a, 0x0170, 0x0e04, 0x5985, 0x2069, 0x0000, 0x6818, ++ 0xd084, 0x1158, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, ++ 0x4080, 0x2069, 0xc93a, 0x683f, 0xffff, 0x012e, 0x2069, 0xc600, ++ 0x6848, 0x6968, 0xa102, 0x2069, 0xc87b, 0x688a, 0x6984, 0x701c, ++ 0xa06d, 0x0120, 0x81ff, 0x0904, 0x59db, 0x00a0, 0x81ff, 0x0904, ++ 0x5aa1, 0x2071, 0xc87b, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, ++ 0x2071, 0xc93a, 0x7038, 0xa005, 0x0128, 0x1b04, 0x5aa1, 0x713a, ++ 0x0804, 0x5aa1, 0x2071, 0xc87b, 0x718c, 0x0126, 0x2091, 0x8000, ++ 0x7084, 0xa10a, 0x0a04, 0x5abc, 0x0e04, 0x5a5d, 0x2071, 0x0000, ++ 0x7018, 0xd084, 0x1904, 0x5a5d, 0x2001, 0xffff, 0x2071, 0xc93a, ++ 0x703a, 0x2071, 0xc87b, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, ++ 0x5b75, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, ++ 0x5a5d, 0x080c, 0x5b9f, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, ++ 0x4080, 0x0804, 0x5a5d, 0x2071, 0xc87b, 0x7000, 0xa005, 0x0904, ++ 0x5a83, 0x6934, 0xa186, 0x0103, 0x1904, 0x5a60, 0x684c, 0xd0bc, ++ 0x1904, 0x5a83, 0x6948, 0x6844, 0xa105, 0x1904, 0x5a78, 0x2009, ++ 0x8020, 0x2071, 0xc87b, 0x7000, 0x0002, 0x5a83, 0x5a43, 0x5a1b, ++ 0x5a2d, 0x59fa, 0x0136, 0x0146, 0x0156, 0x2099, 0xc676, 0x20a1, ++ 0xc8cc, 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, ++ 0xc8c3, 0xad80, 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, ++ 0x700b, 0x0000, 0x2e10, 0x080c, 0x164d, 0x2071, 0xc734, 0x7007, ++ 0x0009, 0x0804, 0x5aa1, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, ++ 0x5aa1, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, ++ 0xc734, 0x080c, 0x5bf6, 0x0804, 0x5aa1, 0x7084, 0x8008, 0xa092, ++ 0x000f, 0x1a04, 0x5aa1, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, ++ 0x2012, 0x8210, 0x6840, 0x2012, 0x7186, 0x2071, 0xc734, 0x080c, ++ 0x5bf6, 0x0804, 0x5aa1, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5a5d, ++ 0x2071, 0x0000, 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, ++ 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, ++ 0xc734, 0x080c, 0x5bf6, 0x0804, 0x5aa1, 0x012e, 0x0804, 0x5aa1, ++ 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, ++ 0xa18e, 0x001f, 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, ++ 0x00ff, 0xa086, 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x59f1, ++ 0x6844, 0xa086, 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, ++ 0x8020, 0x0804, 0x59f1, 0x2071, 0xc734, 0x080c, 0x5c08, 0x01c8, ++ 0x2071, 0xc734, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, ++ 0x0003, 0x1130, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, ++ 0x7007, 0x0003, 0x080c, 0x5c21, 0x7050, 0xa086, 0x0100, 0x0904, ++ 0x5b61, 0x0126, 0x2091, 0x8000, 0x2071, 0xc734, 0x7008, 0xa086, ++ 0x0001, 0x1180, 0x0e04, 0x5aba, 0x2009, 0x000d, 0x7030, 0x200a, ++ 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, ++ 0x7007, 0x0001, 0x012e, 0x0005, 0x2071, 0xc734, 0x080c, 0x5c08, ++ 0x0518, 0x2071, 0xc87b, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, ++ 0xc87c, 0x20a1, 0xc8a3, 0x53a3, 0x7087, 0x0000, 0x2071, 0xc734, ++ 0x2069, 0xc8c3, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, ++ 0x7078, 0x6832, 0x2d10, 0x080c, 0x164d, 0x7007, 0x0008, 0x2001, ++ 0xffff, 0x2071, 0xc93a, 0x703a, 0x012e, 0x0804, 0x5aa1, 0x2069, ++ 0xc8c3, 0x6808, 0xa08e, 0x0000, 0x0904, 0x5b3c, 0xa08e, 0x0200, ++ 0x0904, 0x5b3a, 0xa08e, 0x0100, 0x1904, 0x5b3c, 0x0126, 0x2091, ++ 0x8000, 0x0e04, 0x5b38, 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, 0xc8a0, 0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xc87b, ++ 0x689c, 0x699e, 0x2069, 0xc93a, 0xa102, 0x1118, 0x683c, 0xa005, ++ 0x1368, 0x2001, 0xc8a1, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, ++ 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, ++ 0x012e, 0x0010, 0x7007, 0x0005, 0x0005, 0x2001, 0xc8c5, 0x2004, ++ 0xa08e, 0x0100, 0x1128, 0x7007, 0x0001, 0x080c, 0x5bf6, 0x0005, ++ 0xa08e, 0x0000, 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, ++ 0x0005, 0x701c, 0xa06d, 0x0158, 0x080c, 0x5c08, 0x0140, 0x7007, ++ 0x0003, 0x080c, 0x5c21, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, ++ 0x0005, 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, ++ 0xa086, 0x0200, 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x5bc4, ++ 0x7006, 0x080c, 0x5bf6, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, ++ 0xc87b, 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, ++ 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x5b99, ++ 0x2014, 0x722a, 0x8000, 0x0f04, 0x5b99, 0x2014, 0x722e, 0x8000, ++ 0x0f04, 0x5b99, 0x2014, 0x723a, 0x8000, 0x0f04, 0x5b99, 0x2014, ++ 0x723e, 0xa180, 0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, ++ 0x0156, 0x2071, 0xc87b, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, ++ 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, ++ 0x2014, 0x722a, 0x8000, 0x0f04, 0x5bbb, 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, 0x5bf0, 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, 0x1619, 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, 0xc959, 0x2104, 0xc08d, 0x200a, ++ 0x012e, 0x080c, 0x1669, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, ++ 0xa082, 0x001d, 0x0033, 0x0010, 0x080c, 0x1519, 0x6027, 0x1e00, ++ 0x0005, 0x5d2f, 0x5caa, 0x5cc2, 0x5cff, 0x5d20, 0x5d5a, 0x5d6c, ++ 0x5cc2, 0x5d46, 0x5c4e, 0x5c7c, 0x5c4d, 0x0005, 0x00d6, 0x2069, ++ 0x0200, 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, ++ 0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002, 0x080c, 0x6024, 0x6028, ++ 0xa085, 0x0600, 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xc90c, ++ 0x2d04, 0x7002, 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, ++ 0x0046, 0x0056, 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, ++ 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, ++ 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, ++ 0xc90c, 0x2d04, 0x7002, 0x080c, 0x60b1, 0x6028, 0xa085, 0x0600, ++ 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002, ++ 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, ++ 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, 0x003e, 0x00ee, ++ 0x00de, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, ++ 0x5dd7, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, ++ 0x0020, 0x080c, 0x5dd7, 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, 0x5f52, 0x080c, 0x25fb, 0x0156, ++ 0x6803, 0x0100, 0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, ++ 0x5cdc, 0x0048, 0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, ++ 0x1130, 0x1f04, 0x5ce6, 0x080c, 0x5f73, 0x015e, 0x0078, 0x015e, ++ 0x708f, 0x0028, 0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, ++ 0x0028, 0x708f, 0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, ++ 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x5f52, 0x080c, 0x25fb, ++ 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, ++ 0x1f06, 0x708f, 0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, ++ 0x5e49, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x5dd7, 0x0016, 0x080c, ++ 0x1f06, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, ++ 0x0020, 0x708f, 0x001f, 0x080c, 0x5dd7, 0x0005, 0x6803, 0x00a0, ++ 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, ++ 0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, ++ 0x0021, 0x0005, 0x080c, 0x5e49, 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, 0xc600, 0x2091, 0x8000, ++ 0x080c, 0x5f22, 0x11e8, 0x2001, 0xc60c, 0x200c, 0xd1b4, 0x01c0, ++ 0xc1b4, 0x2102, 0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, ++ 0x0158, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, ++ 0x080c, 0x5f3e, 0x0150, 0x080c, 0x5f34, 0x1138, 0x2001, 0x0001, ++ 0x080c, 0x296d, 0x080c, 0x5ef9, 0x00a0, 0x080c, 0x5e46, 0x0178, ++ 0x2001, 0x0001, 0x080c, 0x296d, 0x708c, 0xa086, 0x001e, 0x0120, ++ 0x708c, 0xa086, 0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, ++ 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, ++ 0x2011, 0x5de8, 0x080c, 0x7070, 0x002e, 0x0016, 0x0026, 0x2009, ++ 0x0064, 0x2011, 0x5de8, 0x080c, 0x7067, 0x002e, 0x001e, 0x0005, ++ 0x00e6, 0x00f6, 0x0016, 0x080c, 0x8bf5, 0x2071, 0xc600, 0x080c, ++ 0x5d83, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, ++ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x8bf5, 0x2061, ++ 0x0100, 0x2069, 0x0140, 0x2071, 0xc600, 0x2091, 0x8000, 0x6028, ++ 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, ++ 0x080c, 0x8f18, 0x080c, 0x8dee, 0x080c, 0x7024, 0x0036, 0x2019, ++ 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x080c, 0xc586, ++ 0x080c, 0xc5a1, 0x2001, 0xc600, 0x2003, 0x0004, 0x6027, 0x0008, ++ 0x080c, 0x12e1, 0x2001, 0x0001, 0x080c, 0x296d, 0x012e, 0x00fe, ++ 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, ++ 0xc600, 0x2004, 0xa086, 0x0004, 0x0140, 0x2001, 0xc8e5, 0x2003, ++ 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, ++ 0x0005, 0x6800, 0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, ++ 0x20a9, 0x002d, 0x1d04, 0x5e52, 0x2091, 0x6000, 0x1f04, 0x5e52, ++ 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, ++ 0x0140, 0x2071, 0xc600, 0x2001, 0xc8e6, 0x200c, 0xa186, 0x0000, ++ 0x0158, 0xa186, 0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, ++ 0x0003, 0x0158, 0x0804, 0x5ee7, 0x708f, 0x0022, 0x0040, 0x708f, ++ 0x0021, 0x0028, 0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, ++ 0x0000, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, ++ 0x2a1c, 0x0026, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, ++ 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, ++ 0x8e79, 0x003e, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, ++ 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, ++ 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, ++ 0x5ef5, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, ++ 0x1130, 0x6803, 0x0100, 0x1f04, 0x5eaa, 0x080c, 0x5f73, 0x012e, ++ 0x015e, 0x080c, 0x5f34, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, ++ 0x0006, 0xa085, 0x0020, 0x6052, 0x080c, 0x5f73, 0xa006, 0x8001, ++ 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, ++ 0x5f73, 0x0016, 0x0026, 0x2009, 0x00c8, 0x2011, 0x5df5, 0x080c, ++ 0x7036, 0x002e, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0004, 0x080c, ++ 0x5c34, 0x080c, 0x5f34, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, ++ 0x1100, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, ++ 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, ++ 0x2071, 0xc600, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x2001, 0xc8d6, ++ 0x2003, 0x0000, 0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, ++ 0x2001, 0x0000, 0x080c, 0x2a1c, 0x6803, 0x0000, 0x6043, 0x0090, ++ 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, ++ 0x00ce, 0x0005, 0x0006, 0x2001, 0xc8e5, 0x2004, 0xa086, 0xaaaa, ++ 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, 0xa084, 0x0030, ++ 0xa086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, ++ 0xa084, 0x0030, 0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, ++ 0xc672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, ++ 0x0006, 0x2001, 0xc672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, ++ 0x000e, 0x0005, 0x2001, 0xc60c, 0x2004, 0xd0a4, 0x0170, 0x080c, ++ 0x2a3c, 0x0036, 0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, ++ 0x2e19, 0x001e, 0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, ++ 0xc60c, 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, ++ 0x2a1c, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, ++ 0x000e, 0x6052, 0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, ++ 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, ++ 0xc600, 0x6020, 0xa084, 0x0080, 0x0138, 0x2001, 0xc60c, 0x200c, ++ 0xc1bd, 0x2102, 0x0804, 0x601c, 0x2001, 0xc60c, 0x200c, 0xc1bc, ++ 0x2102, 0x6028, 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, ++ 0x0090, 0x20a9, 0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5fcb, ++ 0x2091, 0x6000, 0x1f04, 0x5fcb, 0x2011, 0x0003, 0x080c, 0x8f0e, ++ 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x2019, 0x0000, ++ 0x080c, 0x8e79, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, ++ 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, ++ 0x1120, 0x080c, 0x1f06, 0x080c, 0x25fb, 0x60e3, 0x0000, 0x2001, ++ 0xc8d6, 0x2004, 0x080c, 0x2a1c, 0x60e2, 0x6803, 0x0080, 0x20a9, ++ 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, ++ 0x0138, 0x1d04, 0x6001, 0x2091, 0x6000, 0x1f04, 0x6001, 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, 0xc600, 0x2069, ++ 0x0140, 0x6020, 0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, ++ 0x6078, 0x6803, 0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, ++ 0x0000, 0x080c, 0x2a1c, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, ++ 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, ++ 0x0400, 0x2069, 0xc90c, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, ++ 0x0001, 0x20a9, 0x0002, 0x1d04, 0x605b, 0x2091, 0x6000, 0x1f04, ++ 0x605b, 0x0804, 0x60a9, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, ++ 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, ++ 0x1a00, 0x1508, 0x1d04, 0x6067, 0x2091, 0x6000, 0x1f04, 0x6067, ++ 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, ++ 0x080c, 0x8dee, 0x2019, 0x0000, 0x080c, 0x8e79, 0x6803, 0x00a0, ++ 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, ++ 0xa085, 0x0001, 0x00b0, 0x080c, 0x25fb, 0x6803, 0x0080, 0x2069, ++ 0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, ++ 0x0008, 0x6886, 0x2001, 0xc8d6, 0x2004, 0x080c, 0x2a1c, 0x60e2, ++ 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, ++ 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, ++ 0x2061, 0x0100, 0x2071, 0xc600, 0x6020, 0xa084, 0x00c0, 0x01e0, ++ 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, ++ 0x080c, 0x8dee, 0x2019, 0x0000, 0x080c, 0x8e79, 0x2069, 0x0140, ++ 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, ++ 0x2003, 0x0001, 0x0804, 0x614e, 0x2001, 0xc60c, 0x200c, 0xd1b4, ++ 0x1160, 0xc1b5, 0x2102, 0x080c, 0x5ddd, 0x2069, 0x0140, 0x080c, ++ 0x25fb, 0x6803, 0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, ++ 0xa005, 0x1118, 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, ++ 0x602a, 0x6027, 0x0200, 0x2069, 0xc90c, 0x7000, 0x206a, 0x708f, ++ 0x0027, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x6105, 0x2091, ++ 0x6000, 0x1f04, 0x6105, 0x0804, 0x614e, 0x6027, 0x1e00, 0x2009, ++ 0x1e00, 0xe000, 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, ++ 0x1d04, 0x610d, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, ++ 0x6f0a, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, ++ 0xc93a, 0x7018, 0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, ++ 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, 0x080c, 0x7070, 0x002e, ++ 0x2069, 0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, ++ 0x0001, 0x0008, 0x6886, 0x2001, 0xc8d6, 0x2004, 0x080c, 0x2a1c, ++ 0x60e2, 0x2001, 0xc60c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, ++ 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, ++ 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, ++ 0xc600, 0x7130, 0xd184, 0x1180, 0x2011, 0xc653, 0x2214, 0xd2ec, ++ 0x0138, 0xc18d, 0x7132, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x1120, ++ 0x7030, 0xd08c, 0x0904, 0x61bb, 0x7130, 0xc185, 0x7132, 0x2011, ++ 0xc653, 0x220c, 0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, ++ 0xc10d, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, ++ 0x01a0, 0xa186, 0x0080, 0x0188, 0x080c, 0x533d, 0x1170, 0x8127, ++ 0xa006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc190, 0x2009, 0x0001, ++ 0x2011, 0x0100, 0x080c, 0x712e, 0x001e, 0x8108, 0x1f04, 0x6186, ++ 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, ++ 0x0004, 0x080c, 0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, ++ 0x2009, 0x0000, 0x080c, 0x533d, 0x1110, 0x080c, 0x4f47, 0x8108, ++ 0x1f04, 0x61b2, 0x015e, 0x080c, 0x1f06, 0x2011, 0x0003, 0x080c, ++ 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, ++ 0x2019, 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0x080c, 0x5e5a, 0x00ee, 0x00ce, 0x004e, ++ 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2071, 0xc702, 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, 0xc702, 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, 0xc702, 0x7004, 0x0043, ++ 0x700c, 0x0002, 0x6237, 0x622e, 0x622e, 0x622e, 0x622e, 0x0005, ++ 0x628d, 0x628e, 0x62c0, 0x62c1, 0x628b, 0x630f, 0x6314, 0x6345, ++ 0x6346, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x6366, 0x6431, ++ 0x6458, 0x700c, 0x0002, 0x6250, 0x628b, 0x628b, 0x628c, 0x628c, ++ 0x7830, 0x7930, 0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, ++ 0x7030, 0xa10a, 0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, ++ 0x12d0, 0x080c, 0x15e5, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, ++ 0x2001, 0x0003, 0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, ++ 0x2009, 0xc959, 0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, ++ 0x080c, 0x1669, 0x0005, 0x080c, 0x15e5, 0x0de0, 0x2d00, 0x705a, ++ 0x080c, 0x15e5, 0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, ++ 0x2001, 0x0004, 0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, ++ 0x6295, 0x6298, 0x62a6, 0x62bf, 0x62bf, 0x080c, 0x6249, 0x0005, ++ 0x0126, 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x67d4, 0x0120, ++ 0x2091, 0x8000, 0x080c, 0x6249, 0x00de, 0x0048, 0x0126, 0x8001, ++ 0x700e, 0x080c, 0x67d4, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, ++ 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, ++ 0x1218, 0x00db, 0x012e, 0x0005, 0x012e, 0x080c, 0x6367, 0x0005, ++ 0x0005, 0x0005, 0x00e6, 0x2071, 0xc702, 0x700c, 0x0002, 0x62cc, ++ 0x62cc, 0x62cc, 0x62ce, 0x62d1, 0x00ee, 0x0005, 0x700f, 0x0001, ++ 0x0010, 0x700f, 0x0002, 0x00ee, 0x0005, 0x6367, 0x6367, 0x6383, ++ 0x6367, 0x653e, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6383, ++ 0x6580, 0x65c3, 0x660c, 0x6620, 0x6367, 0x6367, 0x639f, 0x6383, ++ 0x63b3, 0x6367, 0x640e, 0x66cc, 0x66e7, 0x6367, 0x639f, 0x6367, ++ 0x63b3, 0x6367, 0x6367, 0x6404, 0x66e7, 0x6367, 0x6367, 0x6367, ++ 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x63c8, 0x6367, ++ 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, ++ 0x6866, 0x6367, 0x67f2, 0x6367, 0x67f2, 0x6367, 0x63dd, 0x7020, ++ 0x2068, 0x080c, 0x1619, 0x0005, 0x700c, 0x0002, 0x631b, 0x631e, ++ 0x632c, 0x6344, 0x6344, 0x080c, 0x6249, 0x0005, 0x0126, 0x8001, ++ 0x700e, 0x7058, 0x0006, 0x080c, 0x67d4, 0x0120, 0x2091, 0x8000, ++ 0x080c, 0x6249, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, ++ 0x67d4, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, ++ 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, ++ 0x012e, 0x0005, 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x6367, ++ 0x6383, 0x652a, 0x6367, 0x6383, 0x6367, 0x6383, 0x6383, 0x6367, ++ 0x6383, 0x652a, 0x6383, 0x6383, 0x6383, 0x6383, 0x6383, 0x6367, ++ 0x6383, 0x652a, 0x6367, 0x6367, 0x6383, 0x6367, 0x6367, 0x6367, ++ 0x6383, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, ++ 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, ++ 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x580a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, ++ 0xc0ed, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, ++ 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x6834, ++ 0x8007, 0xa084, 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, ++ 0x0804, 0x64c1, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, ++ 0x704b, 0x64c1, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, ++ 0x6375, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x64de, 0x7007, ++ 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x64de, 0x0005, ++ 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x6375, 0x8001, 0x1120, ++ 0x7007, 0x0001, 0x0804, 0x6507, 0x7007, 0x0006, 0x7012, 0x2d00, ++ 0x7016, 0x701a, 0x704b, 0x6507, 0x0005, 0x6834, 0x8007, 0xa084, ++ 0x00ff, 0xa086, 0x0001, 0x1904, 0x6375, 0x7007, 0x0001, 0x2009, ++ 0xc631, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, 0x683a, ++ 0x6853, 0x0000, 0x080c, 0x5116, 0x1108, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x580a, 0x012e, ++ 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, 0xa086, ++ 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x66ff, 0x2d00, 0x7016, ++ 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, 0xc72d, ++ 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x6391, 0x6a84, ++ 0xa28a, 0x0002, 0x1a04, 0x6391, 0x82ff, 0x1138, 0x6888, 0x698c, ++ 0xa105, 0x0118, 0x2001, 0x6494, 0x0018, 0xa280, 0x648a, 0x2005, ++ 0x70c6, 0x7010, 0xa015, 0x0904, 0x6476, 0x080c, 0x15e5, 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, 0x164d, ++ 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118, 0x7007, ++ 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x1619, 0x7014, 0x2068, ++ 0x0804, 0x6391, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, ++ 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x6431, 0x7014, 0x2068, ++ 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, 0xa105, ++ 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0904, ++ 0x66ff, 0x04b8, 0x648c, 0x6490, 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, 0xc631, 0x210c, 0x81ff, 0x1198, 0x6838, 0xa084, ++ 0x00ff, 0x683a, 0x080c, 0x4fa6, 0x1108, 0x0005, 0x080c, 0x592e, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0xaf03, 0x080c, 0x580a, 0x012e, ++ 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009, 0xc631, ++ 0x210c, 0x81ff, 0x11d8, 0x6858, 0xa005, 0x01d8, 0x2001, 0xc756, ++ 0x2004, 0xa086, 0x0000, 0x01c0, 0x6838, 0xa084, 0x00ff, 0x683a, ++ 0x6853, 0x0000, 0x080c, 0x5068, 0x1108, 0x0005, 0x684a, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0cb8, 0x2001, 0x0028, ++ 0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2001, 0x002c, 0x0c78, 0x2009, ++ 0xc631, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838, ++ 0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x50ba, 0x1108, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x580a, ++ 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, 0x533d, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x543c, ++ 0x006e, 0x0088, 0x0046, 0x2011, 0xc60c, 0x2224, 0xc484, 0x2412, ++ 0x004e, 0x00c6, 0x080c, 0x533d, 0x1110, 0x080c, 0x559d, 0x8108, ++ 0x1f04, 0x656a, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x1619, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xc653, 0x2004, ++ 0xd0a4, 0x0580, 0x2061, 0xc9bc, 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, 0x67c3, 0x012e, 0x0804, 0x67bd, 0x012e, 0x0804, 0x67b7, ++ 0x012e, 0x0804, 0x67ba, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xc9bc, 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, 0x67c3, 0x012e, 0x0804, ++ 0x67c0, 0x012e, 0x0804, 0x67bd, 0x0126, 0x2091, 0x8000, 0x7007, ++ 0x0001, 0x2061, 0xc9bc, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, ++ 0x0220, 0x630a, 0x012e, 0x0804, 0x67d1, 0x012e, 0x0804, 0x67c0, ++ 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, ++ 0x0148, 0x00c6, 0x2061, 0xc9bc, 0x6000, 0xa084, 0xfcff, 0x6002, ++ 0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598, ++ 0x2001, 0xc631, 0x2004, 0xa005, 0x0118, 0x080c, 0xae54, 0x0068, ++ 0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950, ++ 0x6156, 0x2009, 0x0041, 0x080c, 0x9613, 0x6958, 0xa18c, 0xff00, ++ 0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff, ++ 0x080c, 0x712e, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xc9bc, ++ 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, ++ 0x012e, 0x0804, 0x67c3, 0x00ce, 0x012e, 0x0804, 0x67bd, 0x6954, ++ 0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045, ++ 0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xc60c, 0x200c, 0xc194, ++ 0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18, ++ 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x533d, 0x1960, 0x6000, ++ 0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024, ++ 0x2001, 0xc8fd, 0x2004, 0x6016, 0x0804, 0x665b, 0x685c, 0xa065, ++ 0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xc631, 0x2004, 0xa005, ++ 0x0150, 0x080c, 0xae54, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xae54, ++ 0x00ee, 0x0804, 0x665b, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60, ++ 0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874, ++ 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x00ee, 0x0804, 0x665b, 0x2061, 0xc9bc, 0x6000, 0xd084, ++ 0x0190, 0xd08c, 0x1904, 0x67d1, 0x0126, 0x2091, 0x8000, 0x6204, ++ 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x67d1, 0x012e, 0x6853, ++ 0x0016, 0x0804, 0x67ca, 0x6853, 0x0007, 0x0804, 0x67ca, 0x6834, ++ 0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x6375, 0x0078, 0x2030, ++ 0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006, ++ 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x66ff, 0x0005, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xc631, 0x210c, 0x81ff, ++ 0x1904, 0x677d, 0x2009, 0xc60c, 0x210c, 0xd194, 0x1904, 0x67a7, ++ 0x6848, 0x2070, 0xae82, 0xce00, 0x0a04, 0x6771, 0x2001, 0xc617, ++ 0x2004, 0xae02, 0x1a04, 0x6771, 0x711c, 0xa186, 0x0006, 0x1904, ++ 0x6760, 0x7018, 0xa005, 0x0904, 0x677d, 0x2004, 0xd0e4, 0x1904, ++ 0x67a2, 0x2061, 0xc9bc, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, ++ 0x1550, 0x7020, 0xd0dc, 0x1904, 0x67aa, 0x6853, 0x0000, 0x6803, ++ 0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4, ++ 0x1904, 0x67ad, 0x2e60, 0x080c, 0x708a, 0x012e, 0x00ee, 0x0005, ++ 0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4, ++ 0x1904, 0x67ad, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853, ++ 0x0006, 0x0804, 0x67ca, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, ++ 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x533d, 0x15d8, 0x6000, ++ 0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002, ++ 0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853, ++ 0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xc672, 0x2004, ++ 0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xce00, 0x02c0, 0x605c, ++ 0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005, ++ 0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086, ++ 0x0007, 0x1904, 0x670a, 0x7003, 0x0002, 0x0804, 0x670a, 0x6853, ++ 0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853, ++ 0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002, ++ 0x6017, 0x0014, 0x080c, 0xbd55, 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, 0x580a, 0x012e, ++ 0x0005, 0x080c, 0x1619, 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, 0x7081, ++ 0x00de, 0x0005, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, ++ 0x684d, 0x080c, 0x768f, 0x0904, 0x6850, 0x6868, 0xa084, 0x0007, ++ 0x0904, 0x6844, 0x080c, 0x958d, 0x0904, 0x6847, 0x2d00, 0x6012, ++ 0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x1198, 0x2001, 0xc8e5, ++ 0x2004, 0xa086, 0xaaaa, 0x0130, 0x2001, 0xc635, 0x2004, 0xa084, ++ 0x0028, 0x05c8, 0x6008, 0xc0fd, 0x600a, 0x2001, 0xc8d3, 0x2004, ++ 0x0098, 0x6870, 0xa084, 0x00ff, 0x696c, 0xa18c, 0xff00, 0xa105, ++ 0x696c, 0xa18c, 0x00ff, 0x080c, 0x29c7, 0x11e0, 0x00c6, 0x080c, ++ 0x533d, 0x2c00, 0x00ce, 0x11b0, 0x601a, 0x601f, 0x0001, 0x2009, ++ 0x0040, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x0110, 0x2009, ++ 0x0041, 0x080c, 0x9613, 0x0005, 0x684b, 0x0101, 0x0078, 0x684b, ++ 0x002c, 0x0060, 0x684b, 0x0028, 0x0080, 0x684b, 0x0104, 0x0030, ++ 0x684b, 0x0105, 0x0018, 0x684b, 0x0106, 0x0038, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x580a, 0x012e, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x00c6, ++ 0x0036, 0x0026, 0x0016, 0x7007, 0x0001, 0x6a44, 0xa282, 0x0004, ++ 0x1a04, 0x68b1, 0xd284, 0x0170, 0x6a4c, 0xa290, 0xc77b, 0x2204, ++ 0xa065, 0x6004, 0x05e0, 0x8007, 0xa084, 0x00ff, 0xa084, 0x0006, ++ 0x1108, 0x04a8, 0x2c10, 0x080c, 0x958d, 0x1118, 0x080c, 0xaf0d, ++ 0x05a0, 0x621a, 0x6844, 0x0002, 0x6890, 0x6895, 0x6898, 0x689e, ++ 0x2019, 0x0002, 0x080c, 0xc10d, 0x0060, 0x080c, 0xc0a4, 0x0048, ++ 0x2019, 0x0002, 0x6950, 0x080c, 0xc0bf, 0x0018, 0x6950, 0x080c, ++ 0xc0a4, 0x080c, 0x95e3, 0x6857, 0x0000, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x580a, 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, 0x15e0, 0x20e1, 0x0000, 0x3d00, ++ 0xa094, 0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x1160, ++ 0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x1558, 0x080c, 0x2f69, ++ 0x1540, 0x080c, 0x6b32, 0x0400, 0x20e1, 0x0004, 0x3d60, 0xd1bc, ++ 0x1170, 0x2100, 0xa084, 0xff00, 0xa086, 0x0500, 0x1138, 0x0026, ++ 0x2c10, 0x080c, 0x6d90, 0x002e, 0x01a0, 0x0070, 0x3e60, 0xac84, ++ 0x0007, 0x1178, 0xac82, 0xce00, 0x0260, 0x685c, 0xac02, 0x1248, ++ 0x2009, 0x0047, 0x080c, 0x9613, 0x7a1c, 0xd284, 0x1904, 0x68c9, ++ 0x0005, 0xa016, 0x080c, 0x1870, 0x0cb8, 0x0cd8, 0x781c, 0xd08c, ++ 0x0500, 0x0156, 0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, ++ 0xa584, 0x0076, 0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, ++ 0x080c, 0x6991, 0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, ++ 0x69ad, 0x014e, 0x013e, 0x015e, 0x2009, 0xc92f, 0x2104, 0xa005, ++ 0x1108, 0x0005, 0x080c, 0x7e94, 0x0ce0, 0xa484, 0x7000, 0x1548, ++ 0x080c, 0x6991, 0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, ++ 0x0d10, 0x00a0, 0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1f2d, ++ 0x080c, 0x25fb, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, ++ 0x004e, 0x005e, 0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xc536, ++ 0x20e1, 0x3000, 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, ++ 0x0880, 0x0439, 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, ++ 0x1d68, 0x080c, 0xc536, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, ++ 0x080c, 0x6e1f, 0x005e, 0x0c40, 0x2001, 0xc60e, 0x2004, 0xd08c, ++ 0x0178, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, ++ 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x407d, 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, 0x6c37, ++ 0x0005, 0xa196, 0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, ++ 0x080c, 0x47cb, 0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, ++ 0x080c, 0x6ce3, 0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x6b2c, ++ 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, ++ 0x0023, 0x1904, 0x6b2c, 0xa08e, 0x0023, 0x1570, 0x080c, 0x6d7e, ++ 0x0904, 0x6b2c, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, ++ 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0015, 0x080c, 0x9613, ++ 0x0804, 0x6b2c, 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, ++ 0x2009, 0x0015, 0x080c, 0x9613, 0x0804, 0x6b2c, 0xa08e, 0x0100, ++ 0x1904, 0x6b2c, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0016, ++ 0x080c, 0x9613, 0x0804, 0x6b2c, 0xa08e, 0x0022, 0x1904, 0x6b2c, ++ 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, 0x29f1, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, ++ 0x080c, 0x29c7, 0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, ++ 0x2071, 0xc600, 0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x6b2c, ++ 0x2009, 0x0017, 0x0804, 0x6af2, 0xa08e, 0x0400, 0x1158, 0x7034, ++ 0xa005, 0x1904, 0x6b2c, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, ++ 0x0804, 0x6af2, 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, ++ 0x6b2c, 0x2009, 0x0018, 0x0804, 0x6af2, 0xa08e, 0x2010, 0x1120, ++ 0x2009, 0x0019, 0x0804, 0x6af2, 0xa08e, 0x2110, 0x1120, 0x2009, ++ 0x001a, 0x0804, 0x6af2, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, ++ 0x1904, 0x6b2c, 0x2009, 0x001b, 0x0804, 0x6af2, 0xa08e, 0x5000, ++ 0x1140, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x001c, 0x0804, ++ 0x6af2, 0xa08e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6af2, ++ 0xa08e, 0x1200, 0x1140, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, ++ 0x0024, 0x0804, 0x6af2, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1120, ++ 0x2009, 0x002d, 0x0804, 0x6af2, 0xa08c, 0xff00, 0xa18e, 0x5300, ++ 0x1120, 0x2009, 0x002a, 0x0804, 0x6af2, 0xa08e, 0x0f00, 0x1120, ++ 0x2009, 0x0020, 0x0804, 0x6af2, 0xa08e, 0x5300, 0x1108, 0x00d8, ++ 0xa08e, 0x6104, 0x11c0, 0x2011, 0xcc8d, 0x8208, 0x2204, 0xa082, ++ 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108, ++ 0x0046, 0x2124, 0x080c, 0x407d, 0x004e, 0x8108, 0x1f04, 0x6abc, ++ 0x2009, 0x0023, 0x0438, 0xa08e, 0x6000, 0x1118, 0x2009, 0x003f, ++ 0x0408, 0xa08e, 0x5400, 0x1158, 0x080c, 0x6e79, 0x1904, 0x6b2c, ++ 0x2009, 0x0046, 0x0016, 0x2001, 0xc8d3, 0x2064, 0x0498, 0xa08e, ++ 0x5500, 0x1140, 0x080c, 0x6eac, 0x2009, 0x0041, 0x0158, 0x2009, ++ 0x0042, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0010, ++ 0x2009, 0x001d, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, ++ 0x080c, 0x29c7, 0x1598, 0x080c, 0x52e1, 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, 0x958d, 0x0168, 0x001e, 0x611a, 0x601f, 0x0004, 0x7120, ++ 0x610a, 0x001e, 0x080c, 0x9613, 0x00ce, 0x0005, 0x001e, 0x0ce0, ++ 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6b86, 0x1904, 0x6b83, ++ 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6d7e, 0x0904, 0x6b83, 0x7124, ++ 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034, 0xa005, 0x15d8, ++ 0x2009, 0x0015, 0x080c, 0x9613, 0x04b0, 0xa08e, 0x0100, 0x1598, ++ 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, 0x9613, 0x0458, ++ 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400, 0x1520, 0x2009, ++ 0x0038, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, ++ 0x29c7, 0x11c0, 0x080c, 0x52e1, 0x11a8, 0x6612, 0x6516, 0x00c6, ++ 0x080c, 0x958d, 0x0170, 0x001e, 0x611a, 0x080c, 0xb05e, 0x601f, ++ 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x9613, 0x080c, 0x7e94, ++ 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005, 0x00f6, 0x00d6, ++ 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00, 0x0006, 0x2079, ++ 0x0030, 0x2069, 0x0200, 0x080c, 0x1fec, 0x1590, 0x080c, 0x1e97, ++ 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, 0x1519, 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, 0x1870, 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, 0x6c32, 0xa596, ++ 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596, 0xfffc, 0x1118, ++ 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019, 0xc635, 0x231c, ++ 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xc77b, ++ 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, 0xc7fc, 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, 0x6c0f, 0x82ff, 0x1118, 0xa085, 0x0001, 0x0018, ++ 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, 0x0005, 0xa084, ++ 0x0007, 0x000a, 0x0005, 0x6c43, 0x6c43, 0x6c43, 0x6e0c, 0x6c43, ++ 0x6c44, 0x6c59, 0x6cce, 0x0005, 0x7110, 0xd1bc, 0x0188, 0x7120, ++ 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xce00, 0x0248, 0x685c, ++ 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0x9613, ++ 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x6cac, 0x7110, 0xd1bc, ++ 0x1904, 0x6cac, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, ++ 0x29c7, 0x1904, 0x6cac, 0x080c, 0x52e1, 0x15f0, 0x6612, 0x6516, ++ 0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, ++ 0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0, ++ 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0530, ++ 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009, ++ 0x0044, 0x080c, 0x9613, 0x00c0, 0x00c6, 0x080c, 0x958d, 0x001e, ++ 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, ++ 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, ++ 0x080c, 0x79df, 0x080c, 0x7e94, 0x00ce, 0x0005, 0x2001, 0xc60d, ++ 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x407d, 0x00c6, ++ 0x080c, 0xaf0d, 0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, 0x7120, ++ 0x610a, 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, 0x0001, 0x6007, ++ 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, 0x08f0, 0x7110, 0xd1bc, ++ 0x0188, 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, 0xac82, 0xce00, ++ 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0045, ++ 0x080c, 0x9613, 0x0005, 0x0006, 0x080c, 0x2f69, 0x000e, 0x1168, ++ 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, 0xa084, ++ 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, 0x6cfc, 0x6cfd, ++ 0x6cfc, 0x6cfc, 0x6d66, 0x6d72, 0x0005, 0x7110, 0xd1bc, 0x0120, ++ 0x702c, 0xd084, 0x0904, 0x6d65, 0x700c, 0x7108, 0x080c, 0x29c7, ++ 0x1904, 0x6d65, 0x080c, 0x52e1, 0x1904, 0x6d65, 0x6612, 0x6516, ++ 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, 0x0004, ++ 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, 0x6d7e, 0x00ce, ++ 0x0904, 0x6d65, 0x00c6, 0x080c, 0x958d, 0x001e, 0x05f0, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, ++ 0x080c, 0x9613, 0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0160, ++ 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, ++ 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, 0x958d, 0x001e, ++ 0x01e0, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0005, 0x7120, 0x610a, ++ 0x2009, 0x0088, 0x080c, 0x9613, 0x0080, 0x00c6, 0x080c, 0x958d, ++ 0x001e, 0x0158, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0004, 0x7120, ++ 0x610a, 0x2009, 0x0001, 0x080c, 0x9613, 0x0005, 0x7110, 0xd1bc, ++ 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, ++ 0x9613, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124, ++ 0x610a, 0x2009, 0x008a, 0x080c, 0x9613, 0x0005, 0x7020, 0x2060, ++ 0xac84, 0x0007, 0x1158, 0xac82, 0xce00, 0x0240, 0x2001, 0xc617, ++ 0x2004, 0xac02, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, ++ 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x2f69, 0x1904, 0x6e07, 0x2001, ++ 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, 0x6e07, 0x20e1, 0x0000, ++ 0x3d08, 0xa18c, 0x00ff, 0xa18e, 0x00ff, 0x1500, 0x3e00, 0xa086, ++ 0xffff, 0x11e0, 0x2001, 0xc8d3, 0x2064, 0x2009, 0x00ff, 0x0006, ++ 0x0016, 0x2001, 0xc61d, 0x2004, 0x20e1, 0x0001, 0x3e08, 0xa106, ++ 0x1130, 0x2001, 0xc61c, 0x2004, 0x3d08, 0xa106, 0x0118, 0x001e, ++ 0x000e, 0x00a8, 0x001e, 0x000e, 0x0804, 0x6e07, 0x20e1, 0x0001, ++ 0x3d08, 0x3e00, 0x0156, 0x080c, 0x29c7, 0x015e, 0x15c0, 0x080c, ++ 0x533d, 0x0128, 0x2001, 0xc8d3, 0x2064, 0x2009, 0x00ff, 0x2138, ++ 0x873f, 0x2c00, 0x2070, 0x20e1, 0x0003, 0x3d18, 0x831f, 0xa39c, ++ 0x00ff, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0xa086, 0x1000, ++ 0x0120, 0x080c, 0x75ea, 0x11d8, 0x0080, 0x080c, 0x958d, 0x01b8, ++ 0x20e1, 0x0002, 0x3e08, 0xd19c, 0x0118, 0x6124, 0xc19d, 0x6126, ++ 0x2e00, 0x601a, 0x620a, 0x601f, 0x0009, 0x2009, 0x0101, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x00ee, 0x00de, 0x00ce, 0x0005, 0xa006, ++ 0x00ee, 0x00de, 0x00ce, 0x0005, 0x7110, 0xd1bc, 0x1178, 0x7024, ++ 0x2060, 0xac84, 0x0007, 0x1150, 0xac82, 0xce00, 0x0238, 0x685c, ++ 0xac02, 0x1220, 0x2009, 0x0051, 0x080c, 0x9613, 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, 0x958d, 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xcc83, ++ 0x2204, 0x8211, 0x220c, 0x080c, 0x29c7, 0x1580, 0x080c, 0x52e1, ++ 0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, ++ 0xb05e, 0x080c, 0x1602, 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000, ++ 0x6837, 0x0000, 0x6c3a, 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0, ++ 0x2e98, 0x53a3, 0x006e, 0x6612, 0x6007, 0x003e, 0x601f, 0x0001, ++ 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00fe, 0x00de, ++ 0x00ce, 0x0005, 0x080c, 0x95e3, 0x006e, 0x0cc0, 0x004e, 0x00ce, ++ 0x0cc8, 0x0156, 0x0046, 0x2e00, 0xa0a0, 0x000e, 0x2404, 0x2020, ++ 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0003, 0x2019, ++ 0xc606, 0x2011, 0xcc9b, 0x080c, 0xa103, 0x11d8, 0xd48c, 0x0148, ++ 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, 0xcc9f, 0x080c, 0xa103, ++ 0x1180, 0xd494, 0x0170, 0x080c, 0x7694, 0x0148, 0x20a9, 0x0008, ++ 0x2019, 0xc69a, 0x2011, 0xccaa, 0x080c, 0xa118, 0x0010, 0xa085, ++ 0x0001, 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x2e00, 0xa0a0, ++ 0x000e, 0x2404, 0x2020, 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, ++ 0x20a9, 0x0003, 0x2019, 0xc606, 0x2011, 0xcc93, 0x080c, 0xa103, ++ 0x11d8, 0xd48c, 0x0148, 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, ++ 0xcc97, 0x080c, 0xa103, 0x1180, 0xd494, 0x0170, 0x080c, 0x7694, ++ 0x0148, 0x20a9, 0x0008, 0x2019, 0xc69a, 0x2011, 0xcca2, 0x080c, ++ 0xa118, 0x0010, 0xa085, 0x0001, 0x004e, 0x015e, 0x0005, 0x2071, ++ 0xc93a, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7076, ++ 0x7012, 0x7017, 0xce00, 0x7007, 0x0000, 0x7026, 0x702b, 0x8c0c, ++ 0x7032, 0x7037, 0x8c6c, 0x703b, 0xffff, 0x703f, 0xffff, 0x7042, ++ 0x7047, 0x4787, 0x704a, 0x705b, 0x703f, 0x2001, 0xc8e8, 0x2003, ++ 0x0003, 0x2001, 0xc8ea, 0x2003, 0x0100, 0x3a00, 0xa084, 0x0005, ++ 0x706e, 0x0005, 0x2071, 0xc93a, 0x1d04, 0x6f9c, 0x2091, 0x6000, ++ 0x700c, 0x8001, 0x700e, 0x1518, 0x700f, 0x0361, 0x7007, 0x0001, ++ 0x0126, 0x2091, 0x8000, 0x7040, 0xa00d, 0x0128, 0x8109, 0x7142, ++ 0x1110, 0x7044, 0x080f, 0x00c6, 0x2061, 0xc600, 0x6034, 0x00ce, ++ 0xd0cc, 0x0180, 0x3a00, 0xa084, 0x0005, 0x726c, 0xa216, 0x0150, ++ 0x706e, 0x2011, 0x8043, 0x2018, 0x080c, 0x407d, 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, 0x8cc8, 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, 0x6fc2, 0x6fc3, ++ 0x6fdb, 0x00e6, 0x2071, 0xc93a, 0x7018, 0xa005, 0x1120, 0x711a, ++ 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, ++ 0xc93a, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, ++ 0x0005, 0x00e6, 0x2071, 0xc93a, 0x6088, 0xa102, 0x0208, 0x618a, ++ 0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x533d, 0x1158, 0x6088, ++ 0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x7e94, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007, ++ 0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, ++ 0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, 0xaf4c, ++ 0x6014, 0xa005, 0x0518, 0x8001, 0x6016, 0x1500, 0x611c, 0xa186, ++ 0x0003, 0x0130, 0xa186, 0x0006, 0x0118, 0xa186, 0x0009, 0x11a0, ++ 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0270, 0xa082, 0x1999, ++ 0x6856, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, ++ 0x810b, 0xa108, 0x6116, 0x0010, 0x080c, 0xaa1c, 0x012e, 0xac88, ++ 0x0018, 0x7116, 0x2001, 0xfe00, 0xa102, 0x0220, 0x7017, 0xce00, ++ 0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, 0xc93a, 0x7027, 0x07d0, ++ 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0xc943, 0x2003, 0x0000, ++ 0x0005, 0x00e6, 0x2071, 0xc93a, 0x7132, 0x702f, 0x0009, 0x00ee, ++ 0x0005, 0x2011, 0xc946, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, ++ 0xc93a, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, ++ 0x0026, 0x7054, 0x8000, 0x7056, 0x2061, 0xc8e8, 0x6008, 0xa086, ++ 0x0000, 0x0158, 0x7068, 0x6032, 0x7064, 0x602e, 0x7060, 0x602a, ++ 0x705c, 0x6026, 0x2c10, 0x080c, 0x164d, 0x002e, 0x00ce, 0x0005, ++ 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x6f0a, ++ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6, ++ 0x2071, 0xc93a, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, ++ 0x00e6, 0x0006, 0x2071, 0xc93a, 0x7078, 0xa206, 0x1110, 0x7076, ++ 0x707a, 0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0xc9bc, 0x00ce, ++ 0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0xc9bc, ++ 0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, ++ 0xa005, 0x1150, 0x00c6, 0x2061, 0xc9bc, 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, 0x7105, 0x0005, 0xd0fc, 0x0138, 0xa084, 0x0003, ++ 0x0120, 0xa086, 0x0003, 0x1904, 0x70ff, 0x6020, 0xd0d4, 0x0130, ++ 0xc0d4, 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xc674, ++ 0x2104, 0xd084, 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, ++ 0x9613, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c, 0x9613, ++ 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086, 0x0003, ++ 0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9613, 0x0005, ++ 0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148, 0x87ff, ++ 0x1120, 0x2009, 0x0041, 0x080c, 0x9613, 0x0005, 0x0061, 0x0ce8, ++ 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9613, 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, 0xc9bc, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, ++ 0x6206, 0x00ce, 0x080c, 0x580a, 0x6010, 0xa06d, 0x0076, 0x2039, ++ 0x0000, 0x190c, 0x708a, 0x007e, 0x00de, 0x0005, 0x0156, 0x00c6, ++ 0x2061, 0xc9bc, 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008, 0xa204, ++ 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, ++ 0xa005, 0x0120, 0x8001, 0x680a, 0xa085, 0x0001, 0x0005, 0x2071, ++ 0xc755, 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, ++ 0x0001, 0x702f, 0x0006, 0x7033, 0x0001, 0x7063, 0x0000, 0x0005, ++ 0x00e6, 0x2071, 0xc755, 0x6a2c, 0x721e, 0x6b30, 0x7322, 0x6834, ++ 0x7026, 0x705a, 0x6838, 0x702a, 0x705e, 0x6824, 0x7016, 0x683c, ++ 0x701a, 0x2009, 0x0070, 0x200a, 0xa005, 0x0150, 0x2009, 0x0000, ++ 0xa188, 0x000c, 0x8001, 0x1de0, 0x2100, 0xa210, 0x1208, 0x8318, ++ 0x7252, 0x7356, 0x7010, 0xc084, 0x7012, 0x7007, 0x0001, 0x700f, ++ 0x0000, 0xa006, 0x00ee, 0x0005, 0x2b78, 0x2071, 0xc755, 0x7004, ++ 0x004b, 0x700c, 0x0002, 0x718e, 0x7187, 0x7187, 0x0005, 0x7198, ++ 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ff, 0x7200, 0x700c, 0x0cba, ++ 0x2f00, 0xa080, 0x0070, 0x2004, 0x2f08, 0xa188, 0x0070, 0x210c, ++ 0xa106, 0x0150, 0x2f00, 0xa080, 0x0070, 0x2004, 0x2f08, 0xa188, ++ 0x0070, 0x210c, 0xa106, 0x15e0, 0x7018, 0xa10a, 0x1118, 0x080c, ++ 0x722d, 0x04b0, 0x1210, 0x7114, 0xa10a, 0xa192, 0x000a, 0x0210, ++ 0x2009, 0x000a, 0x00d6, 0x0016, 0x2001, 0xc682, 0xa080, 0x0011, ++ 0x2014, 0x2001, 0xc76f, 0xa080, 0x0005, 0x2004, 0xa100, 0xa202, ++ 0x001e, 0x00de, 0x0e20, 0x080c, 0x727c, 0x2200, 0xa102, 0x0208, ++ 0x2208, 0x713a, 0x080c, 0x7377, 0x2100, 0x7042, 0x2001, 0x0002, ++ 0x7037, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xc959, ++ 0x2104, 0xc095, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x1669, ++ 0x0005, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x71f1, 0x71f4, ++ 0x71fe, 0x080c, 0x7196, 0x0005, 0x0126, 0x8001, 0x700e, 0x7138, ++ 0x0041, 0x2091, 0x8000, 0x080c, 0x7196, 0x012e, 0x0005, 0x0005, ++ 0x0005, 0x7018, 0xa100, 0x7214, 0xa21a, 0x1130, 0x701c, 0x7052, ++ 0x7020, 0x7056, 0xa006, 0x0068, 0x0006, 0x080c, 0x7377, 0x2100, ++ 0x7250, 0xa210, 0x7252, 0x1220, 0x7054, 0xa081, 0x0000, 0x7056, ++ 0x000e, 0x2f08, 0xa188, 0x0070, 0x200a, 0x701a, 0x0005, 0x00e6, ++ 0x2071, 0xc755, 0x700c, 0x0002, 0x7227, 0x7227, 0x7229, 0x00ee, ++ 0x0005, 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x00d6, 0x00e6, 0x2071, 0xc76f, 0x702c, 0xa005, 0x0178, 0x2068, ++ 0x6964, 0x080c, 0x727c, 0x2100, 0x2208, 0xa102, 0x0238, 0x6800, ++ 0x702e, 0x080c, 0x75b9, 0x080c, 0x1629, 0x0c70, 0x00ee, 0x00de, ++ 0x012e, 0x0005, 0x00e6, 0x2071, 0xc76f, 0x702c, 0x6802, 0x2d00, ++ 0x702e, 0x6858, 0x7120, 0xa102, 0x0a0c, 0x1519, 0x7022, 0x685b, ++ 0x0000, 0x00ee, 0x0005, 0x00d6, 0x00e6, 0x2071, 0xc76f, 0xa006, ++ 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, 0x7026, ++ 0x702f, 0x0000, 0x080c, 0x742b, 0x0168, 0x080c, 0x745d, 0x2d00, ++ 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x0007, 0x00ee, ++ 0x00de, 0x0005, 0xa00e, 0x0cd8, 0x00e6, 0x00d6, 0x00c6, 0x2071, ++ 0xc76f, 0x721c, 0x2100, 0xa202, 0x1618, 0x080c, 0x745d, 0x090c, ++ 0x1519, 0x7018, 0xa005, 0x1160, 0x2d00, 0x7002, 0x700a, 0x701a, ++ 0xa006, 0x7006, 0x700e, 0x6806, 0x6802, 0x7012, 0x701e, 0x0038, ++ 0x2060, 0x6806, 0x2d00, 0x6002, 0x701a, 0x6803, 0x0000, 0x7010, ++ 0x8000, 0x7012, 0x701c, 0xa080, 0x0007, 0x701e, 0x721c, 0x08d0, ++ 0x721c, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x0156, 0x0136, 0x0146, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc76f, 0x7300, 0xa398, ++ 0x0003, 0x7104, 0x080c, 0x7377, 0x810c, 0x2100, 0xa318, 0x8003, ++ 0x2228, 0x2021, 0x0054, 0xa402, 0xa532, 0x0208, 0x2028, 0x2500, ++ 0x8004, 0x20a8, 0x23a0, 0xe000, 0xe000, 0xe000, 0x53a5, 0x2508, ++ 0x080c, 0x7380, 0x2130, 0x7014, 0xa600, 0x7016, 0x2600, 0x711c, ++ 0xa102, 0x701e, 0x7004, 0xa600, 0x2008, 0xa082, 0x0007, 0x1180, ++ 0x7000, 0x2004, 0xa005, 0x1140, 0x2009, 0x0001, 0x0026, 0x080c, ++ 0x727c, 0x002e, 0x7000, 0x2004, 0x7002, 0x7007, 0x0000, 0x0008, ++ 0x7106, 0x2500, 0xa212, 0x1910, 0x012e, 0x00ee, 0x014e, 0x013e, ++ 0x015e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x00d6, 0x080c, 0x7340, ++ 0x15e0, 0x2170, 0x2805, 0xac68, 0x2900, 0x0002, 0x7316, 0x7316, ++ 0x731a, 0x7316, 0x731a, 0x7316, 0x7316, 0x7316, 0x7316, 0x7316, ++ 0x7323, 0x7316, 0x7323, 0x7316, 0x7316, 0x7316, 0x080c, 0x1519, ++ 0xa005, 0x00f0, 0x7000, 0x6802, 0x7004, 0x6806, 0x7010, 0x680a, ++ 0x680f, 0x0000, 0x0060, 0x7010, 0x6812, 0x6817, 0x0000, 0x7000, ++ 0x6802, 0x7004, 0x6806, 0x7008, 0x680a, 0x700c, 0x680e, 0x00de, ++ 0x685c, 0x8000, 0x685e, 0x6858, 0x8001, 0x685a, 0x00d6, 0xa006, ++ 0x00de, 0x00ee, 0x002e, 0x001e, 0x0005, 0xa085, 0x0001, 0x0cc0, ++ 0x00e6, 0x0036, 0x2071, 0xc76f, 0x7014, 0xa005, 0x0568, 0x8001, ++ 0x7016, 0x7020, 0x8001, 0x7022, 0x7008, 0xa080, 0x0003, 0x710c, ++ 0x2110, 0x0429, 0x810c, 0xa118, 0x8210, 0xa282, 0x0007, 0x11b0, ++ 0x7008, 0x2004, 0xa005, 0x0178, 0x00d6, 0x0006, 0x7008, 0x2068, ++ 0x080c, 0x746c, 0x000e, 0x2068, 0x6807, 0x0000, 0x700a, 0x00de, ++ 0x7010, 0x8001, 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x2308, ++ 0xa006, 0x003e, 0x00ee, 0x0005, 0xa085, 0x0001, 0x0cd0, 0x0006, ++ 0x810b, 0x810b, 0x2100, 0x810b, 0xa100, 0x2008, 0x000e, 0x0005, ++ 0x0006, 0x0026, 0x2100, 0xa005, 0x0160, 0xa092, 0x000c, 0x0248, ++ 0x2009, 0x0000, 0x8108, 0xa082, 0x000c, 0x1de0, 0x002e, 0x000e, ++ 0x0005, 0x2009, 0x0000, 0x0cd0, 0x2d00, 0xa0b8, 0x0008, 0x690c, ++ 0x6810, 0x2019, 0x0001, 0x2031, 0x73c2, 0xa112, 0x0220, 0x0118, ++ 0x8318, 0x2208, 0x0cd0, 0x6808, 0xa005, 0x0108, 0x8318, 0x233a, ++ 0x6804, 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0xa082, 0x0003, ++ 0x0967, 0x0a67, 0x8420, 0xa082, 0x0007, 0x0967, 0x0a67, 0x0cd0, ++ 0xa082, 0x0002, 0x0967, 0x0a67, 0x8420, 0xa082, 0x0005, 0x0967, ++ 0x0a67, 0x0cd0, 0x6c1a, 0x2d00, 0xa0b8, 0x0007, 0x00e6, 0x2071, ++ 0xc600, 0x7128, 0x6810, 0x2019, 0x0001, 0xa10a, 0x0118, 0x0210, ++ 0x8318, 0x0cd8, 0x2031, 0x73d5, 0x0870, 0x6c16, 0x00ee, 0x0005, ++ 0x00e6, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2e00, 0x2060, 0x2071, ++ 0xc76f, 0x2009, 0x0001, 0x0026, 0x080c, 0x727c, 0x002e, 0x7300, ++ 0xa398, 0x0003, 0x7104, 0x080c, 0x7377, 0x810c, 0x2100, 0xa318, ++ 0x6834, 0xa084, 0x00ff, 0xa086, 0x0024, 0x00d6, 0x2368, 0x1138, ++ 0x6000, 0x6802, 0x6004, 0x6806, 0x6008, 0x6812, 0x0050, 0x6000, ++ 0x6802, 0x6004, 0x6806, 0x6008, 0x680a, 0x600c, 0x680e, 0x6010, ++ 0x6812, 0x00de, 0x7014, 0x8000, 0x7016, 0x711c, 0x8109, 0x711e, ++ 0x7004, 0x8000, 0x2008, 0xa082, 0x0007, 0x1180, 0x7000, 0x2004, ++ 0xa005, 0x1140, 0x2009, 0x0001, 0x0026, 0x080c, 0x727c, 0x002e, ++ 0x7000, 0x2004, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106, 0x012e, ++ 0x00ce, 0x00ee, 0x0005, 0x00d6, 0x0046, 0x0126, 0x2091, 0x8000, ++ 0x2001, 0xc682, 0xa080, 0x0011, 0x2004, 0x8003, 0x2020, 0x080c, ++ 0x15e5, 0x01d0, 0x2d00, 0x7026, 0x6803, 0x0000, 0x6807, 0x0000, ++ 0x080c, 0x15e5, 0x0188, 0x7024, 0x6802, 0x6807, 0x0000, 0x2d00, ++ 0x7026, 0xa4a2, 0x0007, 0x0110, 0x0208, 0x0c90, 0xa085, 0x0001, ++ 0x012e, 0x004e, 0x00de, 0x0005, 0x7024, 0xa005, 0x0dc8, 0x2068, ++ 0x2024, 0x080c, 0x1619, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, ++ 0x7024, 0x2068, 0xa005, 0x0130, 0x2004, 0x7026, 0x6803, 0x0000, ++ 0x6807, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, ++ 0x6802, 0x2d00, 0x7026, 0x012e, 0x0005, 0x00d6, 0x2001, 0xc778, ++ 0x2004, 0xa005, 0x0138, 0x2068, 0x6800, 0x0006, 0x080c, 0x1619, ++ 0x000e, 0x0cb8, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x2071, 0xc76f, ++ 0x7008, 0xa005, 0x0138, 0x2068, 0x6800, 0x0006, 0x080c, 0x1619, ++ 0x000e, 0x0cb8, 0xa006, 0x7002, 0x700a, 0x7006, 0x700e, 0x701a, ++ 0x701e, 0x7022, 0x702a, 0x7026, 0x702e, 0x00ee, 0x00de, 0x0005, ++ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0086, 0x0046, 0x0056, 0x0026, ++ 0x2031, 0x0000, 0x2001, 0xc756, 0x2004, 0xa005, 0x0904, 0x7532, ++ 0x2071, 0xc682, 0x20e1, 0x0002, 0x3d08, 0xd19c, 0x0140, 0x2069, ++ 0xc600, 0x6a28, 0x761c, 0x7114, 0x2041, 0x0000, 0x0028, 0x7118, ++ 0x720c, 0x7620, 0x7008, 0x2040, 0x080c, 0x7627, 0x0904, 0x7532, ++ 0x7004, 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, ++ 0x2021, 0x002c, 0x2029, 0x000a, 0x080c, 0x1602, 0x0904, 0x752a, ++ 0x2d00, 0x2060, 0x6436, 0x0016, 0x20e1, 0x0001, 0x3d08, 0x3e00, ++ 0xa18c, 0x00ff, 0x6142, 0x603e, 0x001e, 0x6746, 0x2700, 0xa086, ++ 0xff00, 0x1118, 0x6063, 0x0000, 0x0010, 0x6063, 0x0003, 0xa006, ++ 0x6002, 0x602a, 0x602e, 0x6006, 0x603a, 0x604a, 0x6052, 0x6057, ++ 0x0005, 0x605e, 0x6066, 0x604e, 0x2800, 0x606a, 0x604c, 0xc0ad, ++ 0x604e, 0x665a, 0x2c00, 0x2078, 0x0479, 0x607f, 0xffff, 0x6083, ++ 0x0000, 0x8109, 0x0180, 0x080c, 0x1602, 0x01c0, 0x2d00, 0x7806, ++ 0x2f00, 0x6802, 0x6d36, 0xa006, 0x2d00, 0x2520, 0x00e9, 0x2d00, ++ 0x2078, 0x8109, 0x1d80, 0x2c00, 0xa005, 0x002e, 0x005e, 0x004e, ++ 0x008e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x2c00, 0x2068, ++ 0x080c, 0x1629, 0x2600, 0x2071, 0xc76f, 0x7120, 0xa102, 0x0a0c, ++ 0x1519, 0x7022, 0xa006, 0x0c48, 0x00d6, 0x00c6, 0x0136, 0x0146, ++ 0x0156, 0x0016, 0x2068, 0x2400, 0xa084, 0x000f, 0xa080, 0x23c7, ++ 0x2005, 0x2005, 0xad60, 0x2c00, 0x2d08, 0xa188, 0x0030, 0xa102, ++ 0x20a8, 0x2c00, 0x20a0, 0x2001, 0xffff, 0x40a4, 0x001e, 0x015e, ++ 0x014e, 0x013e, 0x00ce, 0x00de, 0x0005, 0x00c6, 0x00e6, 0x00f6, ++ 0x6858, 0x2071, 0xc76f, 0x7120, 0xa102, 0x0a0c, 0x1519, 0x7022, ++ 0x6960, 0x694e, 0x697c, 0x2009, 0xffff, 0x7818, 0xa102, 0xe000, ++ 0x6852, 0x684b, 0x0000, 0x6868, 0xa005, 0x0118, 0x6848, 0xc085, ++ 0x684a, 0x2d00, 0xa080, 0x0015, 0x2038, 0x2031, 0x0018, 0x6864, ++ 0x2020, 0x683a, 0x685c, 0xa08a, 0x00ff, 0x1a0c, 0x1519, 0x2028, ++ 0x2d00, 0x2060, 0x2078, 0x6934, 0xa18c, 0x000f, 0xa188, 0x23c7, ++ 0x2145, 0x685c, 0x2050, 0xa005, 0x0530, 0x2805, 0xac70, 0x6834, ++ 0xa084, 0x00ff, 0xa086, 0x0024, 0x1110, 0x7008, 0x0040, 0x6834, ++ 0xa084, 0x00ff, 0xa086, 0x002c, 0x190c, 0x1519, 0x7010, 0x0006, ++ 0x2400, 0xa005, 0x000e, 0x0168, 0x203a, 0x8738, 0x8631, 0x090c, ++ 0x1519, 0x8421, 0x8529, 0x0138, 0x080c, 0x2389, 0x090c, 0x1519, ++ 0x08e0, 0x080c, 0x73d8, 0x6837, 0x0023, 0x00fe, 0x00ee, 0x00ce, ++ 0x0005, 0x00e6, 0x00c6, 0x00a6, 0x0086, 0x0056, 0x2d00, 0x2060, ++ 0x6934, 0xa18c, 0x000f, 0xa188, 0x23c7, 0x2145, 0x685c, 0x2050, ++ 0xa005, 0x01d0, 0x2028, 0x2805, 0xac70, 0x6834, 0xa084, 0x00ff, ++ 0xa086, 0x0024, 0x1110, 0x7008, 0x0008, 0x7010, 0x0006, 0xa086, ++ 0xffff, 0x000e, 0x0110, 0x080c, 0x73d8, 0x8529, 0x0128, 0x080c, ++ 0x2389, 0x090c, 0x1519, 0x0c38, 0x005e, 0x008e, 0x00ae, 0x00ce, ++ 0x00ee, 0x0005, 0x70ac, 0xa005, 0x0120, 0x2060, 0x6008, 0xa306, ++ 0x0005, 0xa085, 0x0001, 0x0ce0, 0x70ac, 0x600e, 0x2c00, 0x70ae, ++ 0x0005, 0x00f6, 0x00d6, 0x0036, 0x70ac, 0xa005, 0x01b8, 0x2068, ++ 0x2079, 0x0000, 0x2c08, 0xa11e, 0x1118, 0x680c, 0x70ae, 0x0060, ++ 0xa106, 0x0140, 0x2d00, 0x2078, 0x680c, 0xa005, 0x090c, 0x1519, ++ 0x2068, 0x0cb0, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x003e, 0x00de, ++ 0x00fe, 0x0005, 0x00e6, 0x080c, 0x724a, 0x6018, 0x2070, 0xa006, ++ 0x70b2, 0x70b6, 0x08b1, 0x080c, 0x95e3, 0x00ee, 0x0005, 0x00d6, ++ 0x0026, 0x0016, 0x2061, 0xc76f, 0x6020, 0x6414, 0xa600, 0xa42a, ++ 0x02f0, 0x6022, 0x2069, 0xc682, 0x6828, 0x6114, 0xa102, 0x1288, ++ 0x685c, 0xd08c, 0x1130, 0xc08d, 0x685e, 0x2011, 0x8025, 0x080c, ++ 0x407d, 0x2001, 0xc695, 0x2004, 0xa080, 0x0000, 0x200c, 0x8108, ++ 0x2102, 0xa085, 0x0001, 0x001e, 0x002e, 0x00de, 0x0005, 0x2069, ++ 0xc682, 0x6804, 0xd094, 0x0148, 0x685c, 0xd084, 0x1130, 0xc085, ++ 0x685e, 0x2011, 0x8026, 0x080c, 0x407d, 0x2001, 0xc695, 0x2004, ++ 0xa080, 0x0001, 0x200c, 0x8108, 0x2102, 0xa006, 0x2031, 0x0000, ++ 0x0c10, 0x0006, 0x0016, 0x00c6, 0x6018, 0x2060, 0x6010, 0xa005, ++ 0x0178, 0x2001, 0xc756, 0x2004, 0xa005, 0x0150, 0x2001, 0xc600, ++ 0x2004, 0xa086, 0x0003, 0x1120, 0x2011, 0x8014, 0x080c, 0x407d, ++ 0x00ce, 0x001e, 0x000e, 0x0005, 0x0016, 0x6834, 0xa08c, 0x00ff, ++ 0xa186, 0x0024, 0x0110, 0xa186, 0x002c, 0x001e, 0x0005, 0x2001, ++ 0xc683, 0x2004, 0xd09c, 0x0005, 0x2001, 0xc683, 0x2004, 0xd0a4, ++ 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, ++ 0x006e, 0x0005, 0x76b2, 0x76b2, 0x76b2, 0x76b4, 0x770f, 0x76b2, ++ 0x76b2, 0x76b2, 0x774d, 0x76b2, 0x77aa, 0x76b2, 0x76b2, 0x76b2, ++ 0x76b2, 0x76b2, 0x080c, 0x1519, 0xa182, 0x0100, 0x0002, 0x76c6, ++ 0x76c6, 0x76c6, 0x76c8, 0x76e1, 0x76fb, 0x76c6, 0x76c6, 0x76c6, ++ 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x080c, 0x1519, ++ 0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, 0x2168, 0x684b, ++ 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, 0x0500, ++ 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95e3, 0x00de, ++ 0x0005, 0x080c, 0x7e47, 0x00f6, 0x00d6, 0x6110, 0x2178, 0x080c, ++ 0xac91, 0x0150, 0x00e6, 0x6018, 0x2070, 0xa006, 0x70b2, 0x70b6, ++ 0x00ee, 0x2f68, 0x080c, 0x580a, 0x00de, 0x00fe, 0x080c, 0x95e3, ++ 0x080c, 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, ++ 0x6110, 0x2168, 0x080c, 0xac91, 0x0120, 0x684b, 0x0029, 0x080c, ++ 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7f6e, 0x0005, 0xa182, ++ 0x0100, 0x0002, 0x7721, 0x7723, 0x772b, 0x7721, 0x7721, 0x7721, ++ 0x7748, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, ++ 0x7721, 0x080c, 0x1519, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x00d6, 0x00e6, 0x2001, 0xc756, 0x2004, ++ 0xa086, 0x0000, 0x6110, 0x1118, 0x080c, 0x1629, 0x0028, 0x2168, ++ 0x080c, 0x7555, 0x080c, 0x580a, 0x6018, 0x2070, 0xa006, 0x70b2, ++ 0x70b6, 0x080c, 0x75f9, 0x00ee, 0x00de, 0x080c, 0x95e3, 0x0005, ++ 0x080c, 0x761a, 0x080c, 0x56c7, 0x0005, 0xa182, 0x0100, 0x0002, ++ 0x7762, 0x7788, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, ++ 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, ++ 0x080c, 0x1519, 0x00d6, 0x6003, 0x0003, 0x6106, 0x6010, 0x2068, ++ 0x687c, 0x680a, 0x6880, 0x680e, 0x6813, 0x0000, 0x6817, 0x0000, ++ 0x6854, 0xa092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, ++ 0x8213, 0xa210, 0x6216, 0x00de, 0x2c10, 0x080c, 0x2068, 0x080c, ++ 0x79fc, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f6e, 0x012e, 0x0005, ++ 0x6003, 0x0004, 0x630a, 0x080c, 0x74a0, 0x0168, 0x6012, 0x600f, ++ 0x0000, 0x080c, 0x75f4, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x2011, 0x0000, 0x080c, 0x1870, 0x00e6, ++ 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x00ee, 0x080c, ++ 0x95e3, 0x0005, 0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, ++ 0x2168, 0x684b, 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, ++ 0x68bb, 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, ++ 0x95e3, 0x00de, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, ++ 0x000b, 0x0005, 0x77da, 0x77da, 0x77da, 0x77dc, 0x77f1, 0x77da, ++ 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, ++ 0x77da, 0x77da, 0x080c, 0x1519, 0x080c, 0x90f6, 0x6110, 0x2168, ++ 0x684b, 0x0006, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, ++ 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95e3, ++ 0x0005, 0x080c, 0x761a, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, ++ 0x1519, 0x000b, 0x0005, 0x780b, 0x780b, 0x780b, 0x780d, 0x781d, ++ 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, ++ 0x780b, 0x780b, 0x780b, 0x080c, 0x1519, 0x0036, 0x00e6, 0x2071, ++ 0xc927, 0x703c, 0xac06, 0x1120, 0x2019, 0x0000, 0x080c, 0x8e79, ++ 0x080c, 0x90f6, 0x00ee, 0x003e, 0x0005, 0x00d6, 0x6010, 0x2068, ++ 0x080c, 0x761a, 0x00de, 0x0005, 0x080c, 0x7684, 0x1150, 0x6024, ++ 0xd09c, 0x1138, 0x6810, 0x2009, 0xffff, 0xa102, 0x2020, 0x2019, ++ 0x0000, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, ++ 0x1208, 0xa200, 0x1f04, 0x7836, 0x8086, 0x818e, 0x0005, 0x0156, ++ 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, ++ 0x0228, 0xa11a, 0x1220, 0x1f04, 0x7846, 0x0028, 0xa11a, 0x2308, ++ 0x8210, 0x1f04, 0x7846, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, ++ 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, ++ 0x0126, 0x2091, 0x2800, 0x2079, 0xc927, 0x012e, 0x00d6, 0x2069, ++ 0xc927, 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, ++ 0x206a, 0x00de, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0xa084, ++ 0x0007, 0x0002, 0x7884, 0x78a5, 0x78f8, 0x788a, 0x78a5, 0x7884, ++ 0x7882, 0x7882, 0x080c, 0x1519, 0x080c, 0x7024, 0x080c, 0x7e94, ++ 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0x7828, 0xa092, 0x00c8, 0x1228, 0x8000, ++ 0x782a, 0x080c, 0x4e52, 0x0c88, 0x080c, 0x4e18, 0x7807, 0x0003, ++ 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, 0x080c, 0x7024, 0x3c00, ++ 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, 0x20e0, ++ 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, ++ 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, 0x9613, 0x00ce, ++ 0x0005, 0x3900, 0xa082, 0xca74, 0x1210, 0x080c, 0x91cb, 0x00c6, ++ 0x7824, 0xa065, 0x090c, 0x1519, 0x7804, 0xa086, 0x0004, 0x0904, ++ 0x7938, 0x7828, 0xa092, 0x2710, 0x1230, 0x8000, 0x782a, 0x00ce, ++ 0x080c, 0x8be8, 0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, 0x00e6, ++ 0x2071, 0xc600, 0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, ++ 0x2061, 0x0100, 0x2071, 0xc600, 0x080c, 0x4e5b, 0x00ee, 0x00ce, ++ 0x080c, 0xc59b, 0x2009, 0x0014, 0x080c, 0x9613, 0x00ce, 0x0838, ++ 0x2001, 0xc943, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, ++ 0x0000, 0x7824, 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, ++ 0x9667, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xca74, ++ 0x1210, 0x080c, 0x91cb, 0x7824, 0xa005, 0x090c, 0x1519, 0x781c, ++ 0xa06d, 0x090c, 0x1519, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, ++ 0x080c, 0x95e3, 0x693c, 0x81ff, 0x090c, 0x1519, 0x8109, 0x693e, ++ 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, ++ 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7e94, 0x0888, ++ 0x6104, 0xa186, 0x0002, 0x0128, 0xa186, 0x0004, 0x0110, 0x0804, ++ 0x78d1, 0x7808, 0xac06, 0x0904, 0x78d1, 0x080c, 0x7db1, 0x080c, ++ 0x79df, 0x00ce, 0x080c, 0x7e94, 0x0804, 0x78bf, 0x00c6, 0x6027, ++ 0x0002, 0x62c8, 0x60c4, 0xa205, 0x11a8, 0x793c, 0xa1e5, 0x0000, ++ 0x0160, 0x2009, 0x0049, 0x601c, 0xa086, 0x0009, 0x1110, 0x2009, ++ 0x0103, 0x080c, 0x9613, 0x00ce, 0x0005, 0x2011, 0xc946, 0x2013, ++ 0x0000, 0x0cc8, 0x3908, 0xa192, 0xca74, 0x1210, 0x080c, 0x91cb, ++ 0x793c, 0x81ff, 0x0d90, 0x7944, 0xa192, 0x7530, 0x12f0, 0x8108, ++ 0x7946, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138, ++ 0x6014, 0xa084, 0x0184, 0xa085, 0x0012, 0x6016, 0x08e0, 0x793c, ++ 0xa188, 0x0007, 0x210c, 0xa18e, 0x0009, 0x0d90, 0x6014, 0xa084, ++ 0x0184, 0xa085, 0x0016, 0x6016, 0x0870, 0x7848, 0xc085, 0x784a, ++ 0x0850, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, ++ 0x0000, 0x2c08, 0x2061, 0xc927, 0x6020, 0x8000, 0x6022, 0x6010, ++ 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, ++ 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, ++ 0xc927, 0x6000, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0xa086, ++ 0x0001, 0x1110, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0804, ++ 0x7e9a, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0158, 0x6056, 0x605b, ++ 0x0000, 0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0xc927, ++ 0x0c18, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8, 0x0006, ++ 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, ++ 0x2061, 0xc927, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0148, ++ 0xa080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, ++ 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, ++ 0x2061, 0xc927, 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, 0xc927, 0x7638, 0x2660, 0x2678, ++ 0x2091, 0x8000, 0x8cff, 0x0904, 0x7a87, 0x6018, 0xa080, 0x0028, ++ 0x2004, 0xa206, 0x1904, 0x7a82, 0x87ff, 0x0120, 0x6050, 0xa106, ++ 0x1904, 0x7a82, 0x703c, 0xac06, 0x1190, 0x0036, 0x2019, 0x0001, ++ 0x080c, 0x8e79, 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, 0xac91, 0x01c8, 0x6010, 0x2068, 0x601c, 0xa086, ++ 0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, ++ 0x0036, 0x0076, 0x080c, 0xaf03, 0x080c, 0xc4d7, 0x080c, 0x580a, ++ 0x007e, 0x003e, 0x001e, 0x080c, 0xae48, 0x080c, 0xae54, 0x00ce, ++ 0x0804, 0x7a22, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7a22, 0x85ff, ++ 0x0120, 0x0036, 0x080c, 0x7f6e, 0x003e, 0x012e, 0x000e, 0x001e, ++ 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, ++ 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x0158, 0x601c, 0xa086, ++ 0x0009, 0x1190, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, 0x95e3, ++ 0x08b0, 0x0016, 0x0036, 0x0076, 0x080c, 0xc4d7, 0x080c, 0xc141, ++ 0x007e, 0x003e, 0x001e, 0x0848, 0x601c, 0xa086, 0x000a, 0x0904, ++ 0x7a6c, 0x0804, 0x7a6a, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x00f6, ++ 0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, 0xc927, 0x7838, ++ 0xa065, 0x0568, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0xac06, ++ 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x7833, 0x0000, ++ 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, ++ 0x003e, 0x080c, 0xac91, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, ++ 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, ++ 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x000e, 0x0888, 0x7e3a, ++ 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, ++ 0x601c, 0xa086, 0x0006, 0x0150, 0x601c, 0xa086, 0x0009, 0x1148, ++ 0x6b4a, 0x080c, 0x580a, 0x080c, 0x95e3, 0x0c38, 0x080c, 0xc141, ++ 0x0c10, 0x601c, 0xa086, 0x000a, 0x09b8, 0x08a0, 0x0016, 0x0026, ++ 0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x7be4, 0x008e, 0x002e, ++ 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xc927, 0x2091, 0x8000, ++ 0x080c, 0x7c71, 0x080c, 0x7ce3, 0x012e, 0x00fe, 0x0005, 0x00f6, ++ 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, ++ 0x7bba, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x7bb5, ++ 0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x7bb5, 0x7024, 0xac06, ++ 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x7024, ++ 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 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, 0xac91, 0x01b8, 0x601c, ++ 0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, ++ 0x0016, 0x0036, 0x0086, 0x080c, 0xaf03, 0x080c, 0xc4d7, 0x080c, ++ 0x580a, 0x008e, 0x003e, 0x001e, 0x080c, 0xae48, 0x080c, 0xae54, ++ 0x080c, 0x8fb7, 0x00ce, 0x0804, 0x7b3e, 0x2c78, 0x600c, 0x2060, ++ 0x0804, 0x7b3e, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, ++ 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016, ++ 0x0036, 0x0086, 0x080c, 0xc4d7, 0x080c, 0xc141, 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, 0xc77b, 0x2004, 0xa065, 0x0904, 0x7c6d, 0x00f6, ++ 0x00e6, 0x00d6, 0x0066, 0x2071, 0xc927, 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, 0x5268, 0x0904, 0x7c69, ++ 0x7624, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, ++ 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x7024, ++ 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 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, 0xae54, 0x00ce, 0x0048, 0x00de, ++ 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7c14, ++ 0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, ++ 0xaf03, 0x080c, 0xc4d7, 0x080c, 0x580a, 0x080c, 0x8fb7, 0x0804, ++ 0x7c14, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, ++ 0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, 0x7814, ++ 0xa065, 0x0904, 0x7cc3, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, ++ 0xac06, 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, ++ 0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 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, 0xac91, 0x0168, 0x601c, ++ 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x080c, 0x8fb7, ++ 0x000e, 0x0804, 0x7c78, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, ++ 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xc141, ++ 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, 0x7d49, 0x6054, 0x0006, 0x6057, 0x0000, 0x605b, ++ 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x5268, 0x0904, ++ 0x7d46, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, ++ 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, ++ 0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 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, 0xae54, 0x00ce, 0x0048, ++ 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, ++ 0x7cf5, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0x8fb7, 0x0804, 0x7cf5, 0x000e, 0x0804, ++ 0x7ce8, 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, ++ 0x00e6, 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0xa06d, ++ 0x0188, 0x6848, 0xa606, 0x1170, 0x2071, 0xc927, 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, 0x8bf5, 0x78c3, 0x0000, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384, ++ 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, ++ 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x90e6, 0x003e, ++ 0x080c, 0x5268, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, ++ 0x2660, 0x080c, 0x95e3, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x080c, 0xaf03, 0x080c, 0x580a, 0x080c, 0x8fb7, 0x00fe, ++ 0x0005, 0x00e6, 0x00c6, 0x2071, 0xc927, 0x7004, 0xa084, 0x0007, ++ 0x0002, 0x7dc3, 0x7dc6, 0x7ddc, 0x7df5, 0x7e32, 0x7dc3, 0x7dc1, ++ 0x7dc1, 0x080c, 0x1519, 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, 0x5268, ++ 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0120, 0x6054, ++ 0xa015, 0x0140, 0x721e, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, ++ 0x00ee, 0x0005, 0x7218, 0x721e, 0x0cb0, 0x7024, 0xa065, 0x05b8, ++ 0x700c, 0xac06, 0x1160, 0x080c, 0x8fb7, 0x600c, 0xa015, 0x0120, ++ 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, ++ 0xac06, 0x1160, 0x080c, 0x8fb7, 0x600c, 0xa015, 0x0120, 0x7216, ++ 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, 0xa086, ++ 0x0003, 0x1198, 0x6018, 0x2060, 0x080c, 0x5268, 0x6000, 0xc0dc, ++ 0x6002, 0x080c, 0x8fb7, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015, ++ 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, ++ 0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x8fb7, 0x600c, ++ 0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x90e6, 0x7027, ++ 0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, ++ 0x2069, 0xc927, 0x6830, 0xa084, 0x0003, 0x0002, 0x7e54, 0x7e56, ++ 0x7e7a, 0x7e52, 0x080c, 0x1519, 0x00de, 0x0005, 0x00c6, 0x6840, ++ 0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015, ++ 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, ++ 0x2011, 0xc946, 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, 0xc927, 0x6804, ++ 0xa084, 0x0007, 0x0006, 0xa005, 0x11c8, 0x2001, 0xc635, 0x2004, ++ 0xa084, 0x0028, 0x1198, 0x2001, 0xc8e5, 0x2004, 0xa086, 0xaaaa, ++ 0x0168, 0x2001, 0xc696, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118, ++ 0x0028, 0x080c, 0x7f6e, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, ++ 0x7ec2, 0x7f5e, 0x7f5e, 0x7f5e, 0x7f5e, 0x7f60, 0x7ec0, 0x7ec0, ++ 0x080c, 0x1519, 0x6820, 0xa005, 0x1110, 0x00de, 0x0005, 0x00c6, ++ 0x680c, 0xa065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, ++ 0x080c, 0x7ff0, 0x00ce, 0x00de, 0x0005, 0x6814, 0xa065, 0x0150, ++ 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x7ff0, 0x00ce, ++ 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, 0x0000, 0x0904, ++ 0x7f5a, 0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, 0x01a0, 0x7054, ++ 0xa075, 0x0120, 0xa20e, 0x0904, 0x7f5a, 0x0028, 0x6818, 0xa20e, ++ 0x0904, 0x7f5a, 0x2070, 0x704c, 0xa00d, 0x0d88, 0x7088, 0xa005, ++ 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x1e40, 0x080c, ++ 0x95ba, 0x0904, 0x7f5a, 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, 0xc635, 0x2004, 0xd0ac, 0x1110, ++ 0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120, 0x7114, 0xa18c, 0x00ff, ++ 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2f6e, 0x2c0d, 0xa18c, ++ 0x00ff, 0x2061, 0x0100, 0x619a, 0x080c, 0x8620, 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, 0x7ff0, 0x00ce, 0x00de, 0x0005, 0x00f6, 0x00d6, ++ 0x2069, 0xc927, 0x6830, 0xa086, 0x0000, 0x1904, 0x7fcb, 0x2001, ++ 0xc60c, 0x200c, 0xd1bc, 0x1904, 0x7fe6, 0x6838, 0xa07d, 0x0904, ++ 0x7fcb, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, 0x11f8, 0x2001, ++ 0xc8e5, 0x2004, 0xa086, 0xaaaa, 0x01c8, 0x781c, 0xa086, 0x0009, ++ 0x11a8, 0x7808, 0xd0fc, 0x0190, 0x2001, 0xc928, 0x2004, 0xa005, ++ 0x1138, 0x2001, 0xc696, 0x200c, 0xc185, 0xc18c, 0x2102, 0x0030, ++ 0x2011, 0xc696, 0x2204, 0xc08d, 0x2012, 0x0428, 0x2f00, 0x6833, ++ 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, ++ 0x2091, 0x2400, 0x002e, 0x080c, 0x20ef, 0x11c0, 0x012e, 0xe000, ++ 0xe000, 0xe000, 0x6a3c, 0x2278, 0x781c, 0xa086, 0x0009, 0x1148, ++ 0x7808, 0xd0fc, 0x0118, 0x080c, 0x8969, 0x0028, 0x080c, 0x89e2, ++ 0x0010, 0x080c, 0x8a66, 0x00de, 0x00fe, 0x0005, 0x012e, 0xe000, ++ 0x6843, 0x0000, 0x781c, 0xa086, 0x0009, 0x0110, 0x7803, 0x0002, ++ 0x780c, 0xa015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, ++ 0x683f, 0x0000, 0x0c40, 0x683a, 0x6836, 0x0cc0, 0xc1bc, 0x2102, ++ 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0804, 0x7f7d, ++ 0x601c, 0xa084, 0x000f, 0x000b, 0x0005, 0x7ffe, 0x8003, 0x84c1, ++ 0x85dd, 0x8003, 0x84c1, 0x85dd, 0x7ffe, 0x8003, 0x080c, 0x7db1, ++ 0x080c, 0x7e94, 0x0005, 0x0156, 0x0136, 0x0146, 0x00c6, 0x00f6, ++ 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1519, 0x6118, 0x2178, 0x79a0, ++ 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900, ++ 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, ++ 0x0028, 0xa1f8, 0x2f6e, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061, ++ 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04, 0x8077, 0x0033, 0x00fe, ++ 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x8126, 0x8171, 0x819e, ++ 0x826b, 0x8299, 0x82a1, 0x82c7, 0x82d8, 0x82e9, 0x82f1, 0x8307, ++ 0x82f1, 0x8368, 0x82d8, 0x8389, 0x8391, 0x82e9, 0x8391, 0x83a2, ++ 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, ++ 0x8075, 0x8075, 0x8075, 0x8d1a, 0x8d3f, 0x8d54, 0x8d77, 0x8d98, ++ 0x82c7, 0x8075, 0x82c7, 0x82f1, 0x8075, 0x819e, 0x826b, 0x8075, ++ 0x91e8, 0x82f1, 0x8075, 0x9208, 0x82f1, 0x8075, 0x82e9, 0x811f, ++ 0x808a, 0x8075, 0x922d, 0x92a2, 0x9379, 0x8075, 0x938a, 0x82c2, ++ 0x93a6, 0x8075, 0x8dad, 0x9401, 0x8075, 0x080c, 0x1519, 0x2100, ++ 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x9458, ++ 0x9507, 0x8088, 0x80be, 0x80dc, 0x80f2, 0x8088, 0x82c7, 0x8088, ++ 0x080c, 0x1519, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x83bf, 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, 0x8be2, 0x00de, 0x0005, 0x00d6, ++ 0x7818, 0x2068, 0x68a0, 0x2069, 0xc600, 0x6ad4, 0xd2ac, 0x1110, ++ 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de, 0x0005, 0x00d6, 0x20a1, ++ 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x7810, ++ 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, 0x20a2, ++ 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, 0x0010, ++ 0x080c, 0x8be2, 0x00de, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x20a3, 0x7800, 0x20a3, 0x0000, 0x7808, 0x8007, ++ 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x014e, ++ 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x845b, ++ 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0xdf10, 0x20a3, 0x0034, ++ 0x2099, 0xc605, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xc601, 0x20a9, ++ 0x0004, 0x53a6, 0x2099, 0xc90d, 0x20a9, 0x001a, 0x3304, 0x8007, ++ 0x20a2, 0x9398, 0x1f04, 0x810e, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x004c, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x2001, ++ 0xc615, 0x2004, 0x609a, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x00d6, 0x2069, ++ 0xc652, 0x6804, 0xd084, 0x0150, 0x6828, 0x20a3, 0x0000, 0x0016, ++ 0x080c, 0x29db, 0x21a2, 0x001e, 0x00de, 0x0028, 0x00de, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xc605, 0x53a6, ++ 0x20a9, 0x0004, 0x2099, 0xc601, 0x53a6, 0x2001, 0xc635, 0x2004, ++ 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, ++ 0x0238, 0x2001, 0xc61c, 0x20a6, 0x2001, 0xc61d, 0x20a6, 0x0040, ++ 0x20a3, 0x0000, 0x2001, 0xc615, 0x2004, 0xa084, 0x00ff, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0500, 0x20a3, ++ 0x0000, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xc61c, 0x20a6, ++ 0x2001, 0xc61d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xc615, ++ 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0xc605, ++ 0x53a6, 0x60c3, 0x0010, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x00c6, 0x7818, 0x2060, 0x2001, 0x0000, 0x080c, ++ 0x5715, 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, 0x822d, 0x2001, 0xc635, 0x2004, 0xd0a4, 0x01c8, ++ 0x2099, 0xc8d5, 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398, 0x3304, ++ 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x20a3, 0x0000, ++ 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x33a6, ++ 0x00d0, 0x2099, 0xc8d5, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, ++ 0x080c, 0x5f22, 0x1118, 0xa084, 0x37ff, 0x0010, 0xa084, 0x3fff, ++ 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xc605, 0x53a6, ++ 0x20a9, 0x0004, 0x2099, 0xc601, 0x53a6, 0x20a9, 0x0008, 0x20a3, ++ 0x0000, 0x1f04, 0x8207, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, ++ 0x820d, 0x2099, 0xc8dd, 0x3304, 0xc0dd, 0x20a2, 0x2001, 0xc672, ++ 0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, ++ 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004, 0x0010, 0x20a9, 0x0007, ++ 0x20a3, 0x0000, 0x1f04, 0x8228, 0x0468, 0x2001, 0xc635, 0x2004, ++ 0xd0a4, 0x0140, 0x2001, 0xc8d6, 0x2004, 0x60e3, 0x0000, 0x080c, ++ 0x2a1c, 0x60e2, 0x2099, 0xc8d5, 0x20a9, 0x0008, 0x53a6, 0x20a9, ++ 0x0004, 0x2099, 0xc605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xc601, ++ 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x824b, 0x20a9, ++ 0x0008, 0x20a3, 0x0000, 0x1f04, 0x8251, 0x2099, 0xc8dd, 0x20a9, ++ 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x825c, ++ 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x8262, 0x60c3, 0x0074, ++ 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, ++ 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, 0xc652, ++ 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, ++ 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6, 0x0804, 0x834a, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x5000, 0x0804, ++ 0x81b9, 0x20a1, 0x020b, 0x080c, 0x83bf, 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, ++ 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x8453, 0x0020, 0x20a1, ++ 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8be2, 0x0005, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, 0x0000, ++ 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x0804, ++ 0x81b9, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, ++ 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2, 0x0010, 0x20a3, 0x0003, ++ 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x00d6, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0210, 0x20a3, 0x0014, ++ 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x1198, ++ 0x699c, 0xa184, 0x0030, 0x0190, 0x6998, 0xa184, 0xc000, 0x1140, ++ 0xd1ec, 0x0118, 0x20a3, 0x2100, 0x0058, 0x20a3, 0x0100, 0x0040, ++ 0x20a3, 0x0400, 0x0028, 0x20a3, 0x0700, 0x0010, 0x700f, 0x0800, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, ++ 0xc652, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, ++ 0x0110, 0xa085, 0x0010, 0x2009, 0xc674, 0x210c, 0xd184, 0x1110, ++ 0xa085, 0x0002, 0x0026, 0x2009, 0xc672, 0x210c, 0xd1e4, 0x0130, ++ 0xc0c5, 0xa094, 0x0030, 0xa296, 0x0010, 0x0140, 0xd1ec, 0x0130, ++ 0xa094, 0x0030, 0xa296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x20a2, ++ 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x080c, 0x8be2, 0x00de, 0x0005, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 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, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x0804, ++ 0x812c, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, ++ 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, ++ 0x8be2, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, ++ 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, ++ 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8be2, 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, 0xc615, 0x2214, 0x2001, 0xc8e5, 0x2004, 0xa005, 0x0118, ++ 0x2011, 0xc61d, 0x2214, 0x22a2, 0x04d0, 0xa286, 0x007f, 0x1138, ++ 0x00d6, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x00c8, 0x2001, ++ 0xc635, 0x2004, 0xd0ac, 0x1110, 0xd2bc, 0x01c8, 0xa286, 0x0080, ++ 0x00d6, 0x1130, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0040, ++ 0xa2e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, ++ 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, ++ 0xa2e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, ++ 0x00de, 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0xa485, ++ 0x0029, 0x20a2, 0x004e, 0x003e, 0x20a3, 0x0000, 0x080c, 0x8bd1, ++ 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x002e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, 0x00d6, 0x2069, ++ 0xc61c, 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, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, ++ 0x007e, 0x02d8, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, ++ 0x20a2, 0x6814, 0x20a2, 0x6810, 0xa005, 0x1140, 0x6814, 0xa005, ++ 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0028, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, ++ 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0xa485, 0x0098, 0x20a2, ++ 0x20a3, 0x0000, 0x004e, 0x003e, 0x080c, 0x8bd1, 0x22a2, 0x20a3, ++ 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x002e, 0x0005, 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x7a08, ++ 0x22a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, ++ 0x0005, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x1519, ++ 0xa08a, 0x008c, 0x1a0c, 0x1519, 0x6118, 0x2178, 0x79a0, 0x2011, ++ 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4, ++ 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, ++ 0xa1f8, 0x2f6e, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, ++ 0x619a, 0xa082, 0x0085, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x84f8, ++ 0x8502, 0x851d, 0x84f6, 0x84f6, 0x84f6, 0x84f8, 0x080c, 0x1519, ++ 0x0146, 0x20a1, 0x020b, 0x04a1, 0x60c3, 0x0000, 0x080c, 0x8be2, ++ 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8569, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3, ++ 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, ++ 0x000c, 0x080c, 0x8be2, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, ++ 0x080c, 0x85a3, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8be2, 0x014e, 0x0005, ++ 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, ++ 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x8100, ++ 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, ++ 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, ++ 0x8100, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, ++ 0xc615, 0x2214, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, 0x0804, ++ 0x8426, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, ++ 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, ++ 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, ++ 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, ++ 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, ++ 0x2011, 0xc615, 0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, ++ 0x0000, 0x0804, 0x84b2, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, ++ 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x2001, 0x0099, ++ 0x20a2, 0x20a3, 0x0000, 0x0804, 0x84b2, 0x00c6, 0x00f6, 0x2c78, ++ 0x7804, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c, ++ 0x1519, 0x7918, 0x2160, 0x61a0, 0x2011, 0xc635, 0x2214, 0xd2ac, ++ 0x1110, 0xd1bc, 0x0150, 0x6100, 0xd1f4, 0x0120, 0x6114, 0xa18c, ++ 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2f6e, 0x2c0d, ++ 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x001b, ++ 0x00fe, 0x00ce, 0x0005, 0x8620, 0x872c, 0x86c9, 0x88de, 0x861e, ++ 0x861e, 0x861e, 0x861e, 0x861e, 0x861e, 0x861e, 0x8f70, 0x8f80, ++ 0x8f90, 0x8fa0, 0x861e, 0x93b7, 0x861e, 0x8f5f, 0x080c, 0x1519, ++ 0x00d6, 0x0156, 0x0146, 0x780b, 0xffff, 0x20a1, 0x020b, 0x080c, ++ 0x8680, 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, 0xc943, 0x2003, 0x07d0, 0x2001, 0xc942, ++ 0x2003, 0x0009, 0x080c, 0x17f1, 0x014e, 0x015e, 0x00de, 0x0005, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, ++ 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2019, 0xc635, 0x231c, 0xd3ac, 0x1110, 0xd0bc, 0x0188, ++ 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, ++ 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0600, ++ 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2009, 0xc615, ++ 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, 0x8be2, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, ++ 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, ++ 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, ++ 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0500, ++ 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xc615, ++ 0x2214, 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x080c, 0x8bd1, ++ 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, ++ 0x7810, 0xa0ec, 0xf000, 0x0168, 0xa06d, 0x080c, 0x56bf, 0x0148, ++ 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x1118, 0x7820, 0xc0cd, ++ 0x7822, 0x20a1, 0x020b, 0x080c, 0x8894, 0xa016, 0x22a2, 0x22a2, ++ 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x1130, 0x7810, ++ 0xa084, 0x0700, 0x8007, 0x0043, 0x0010, 0xa006, 0x002b, 0x014e, ++ 0x013e, 0x015e, 0x00de, 0x0005, 0x8766, 0x87fb, 0x880b, 0x883d, ++ 0x8850, 0x886b, 0x8874, 0x8764, 0x080c, 0x1519, 0x0016, 0x0036, ++ 0x694c, 0xa18c, 0x0003, 0x0118, 0xa186, 0x0003, 0x1170, 0x6b78, ++ 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, ++ 0x20a2, 0x003e, 0x001e, 0x0804, 0x8847, 0xa186, 0x0001, 0x190c, ++ 0x1519, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, ++ 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c, ++ 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0904, 0x87f5, 0xd3c4, ++ 0x0110, 0x687c, 0xa108, 0xd3cc, 0x0110, 0x6874, 0xa108, 0x0156, ++ 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, ++ 0x1f04, 0x87a4, 0x015e, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, ++ 0x0904, 0x87f5, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x0006, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, ++ 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x000e, 0x7b20, ++ 0xd3cc, 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, 0x20a2, ++ 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x003e, 0x001e, ++ 0x080c, 0x8be2, 0x0005, 0x2011, 0x0008, 0x2001, 0xc60d, 0x2004, ++ 0xd0f4, 0x0110, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, ++ 0x22a2, 0xa016, 0x04d0, 0x2011, 0x0302, 0x0016, 0x0036, 0x7828, ++ 0x792c, 0xa11d, 0x0108, 0xc2dd, 0x7b20, 0xd3cc, 0x0108, 0xc2e5, ++ 0x22a2, 0x20a2, 0x21a2, 0x003e, 0x001e, 0xa016, 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, 0x8be2, 0x0005, 0x2011, 0x0028, 0x7820, ++ 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, ++ 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x080c, 0x8be2, 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, 0x8be2, 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, 0x8847, 0x0026, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, ++ 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x7820, 0xd0cc, ++ 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, 0x20a3, 0x0000, ++ 0x080c, 0x8bd1, 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, ++ 0x88f8, 0x88f8, 0x88fa, 0x88f8, 0x88f8, 0x88f8, 0x891c, 0x88f8, ++ 0x080c, 0x1519, 0x7910, 0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912, ++ 0x20a1, 0x020b, 0x2009, 0x0003, 0x00f9, 0x00d6, 0x2069, 0xc652, ++ 0x6804, 0xd0bc, 0x0130, 0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, ++ 0x0010, 0x20a3, 0x3f00, 0x00de, 0x22a2, 0x22a2, 0x22a2, 0x60c3, ++ 0x0001, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x2009, 0x0003, ++ 0x0019, 0x20a3, 0x7f00, 0x0c80, 0x0026, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, ++ 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x20a3, 0x0888, ++ 0xa18d, 0x0008, 0x21a2, 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, ++ 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, ++ 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, ++ 0x2061, 0x0100, 0x2071, 0xc600, 0x2009, 0xc615, 0x210c, 0x7818, ++ 0x2068, 0x2031, 0xc635, 0x2634, 0xa6b4, 0x0028, 0x0110, 0x7370, ++ 0x7474, 0x2500, 0x2031, 0xc635, 0x2634, 0xa6b4, 0x0028, 0x0140, ++ 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, ++ 0x2001, 0x00ff, 0xa085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, ++ 0x0000, 0x616e, 0x68b8, 0x6073, 0x0530, 0x6077, 0x0008, 0x688c, ++ 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0xa085, 0x0020, 0x607a, ++ 0x68b4, 0x607f, 0x0000, 0x2d00, 0x6082, 0x6087, 0xffff, 0x7810, ++ 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, ++ 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, ++ 0x0000, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, 0x0128, 0x609f, ++ 0x0000, 0x2001, 0x0092, 0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f, ++ 0x00ff, 0x6027, 0xffff, 0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0, ++ 0x080c, 0x7029, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, ++ 0x0036, 0x2061, 0x0100, 0x2071, 0xc600, 0x2009, 0xc615, 0x210c, ++ 0x7818, 0x2068, 0x68a0, 0x2028, 0x2031, 0xc635, 0x2634, 0xd6ac, ++ 0x1160, 0xa582, 0x007e, 0x1248, 0x2500, 0xd0bc, 0x1130, 0xa080, ++ 0x2f6e, 0x2015, 0xa294, 0x00ff, 0x0020, 0x6910, 0x6a14, 0x7370, ++ 0x7474, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1128, 0xa582, 0x007e, ++ 0x1210, 0xd5bc, 0x0138, 0xa185, 0x0400, 0x6062, 0x6266, 0x636a, ++ 0x646e, 0x0030, 0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, ++ 0x68b8, 0x6072, 0x6077, 0x0000, 0x6864, 0xd0a4, 0x0110, 0x6077, ++ 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0xa085, ++ 0x0020, 0x607a, 0x68b4, 0x607f, 0x0000, 0x2d00, 0x6082, 0x6087, ++ 0xffff, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, ++ 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, ++ 0x95d5, 0x60d7, 0x0000, 0xa582, 0x007e, 0x0210, 0x2011, 0x0000, ++ 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, 0x2009, ++ 0x0092, 0x6116, 0x2009, 0x07d0, 0x080c, 0x7029, 0x003e, 0x004e, ++ 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x00e6, 0x00d6, ++ 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xc600, ++ 0x7154, 0x7818, 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, ++ 0xd0bc, 0x1120, 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, ++ 0x7370, 0x7474, 0x781c, 0xa0be, 0x0006, 0x0904, 0x8b1c, 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, 0x9452, 0x2009, 0x07d0, 0x60c4, ++ 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7029, ++ 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, 0x9452, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, ++ 0x0110, 0x2009, 0x1b58, 0x080c, 0x7029, 0x003e, 0x004e, 0x005e, ++ 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, ++ 0x0003, 0xa086, 0x0002, 0x0904, 0x8b72, 0x2001, 0xc635, 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, 0x944f, ++ 0x0804, 0x8b0a, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1110, 0xd5bc, ++ 0x0138, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, ++ 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, ++ 0x56bf, 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, 0x9452, 0x0804, 0x8b0a, 0x080c, 0x944f, 0x0804, ++ 0x8b0a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, ++ 0x2202, 0x8217, 0x0005, 0x00d6, 0x2069, 0xc927, 0x6843, 0x0001, ++ 0x00de, 0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, ++ 0x0019, 0x080c, 0x701b, 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, 0x5f22, 0x1198, 0x2001, ++ 0xc943, 0x2004, 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, ++ 0x5fa4, 0x006e, 0x1118, 0x080c, 0x701b, 0x0468, 0x00c6, 0x2061, ++ 0xc927, 0x00d8, 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, ++ 0x1000, 0x6803, 0x0000, 0x00c6, 0x2061, 0xc927, 0x6128, 0xa192, ++ 0x00c8, 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, ++ 0x080c, 0x701b, 0x080c, 0x8bec, 0x0070, 0x6124, 0xa1e5, 0x0000, ++ 0x0140, 0x080c, 0xc59b, 0x080c, 0x7024, 0x2009, 0x0014, 0x080c, ++ 0x9613, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, ++ 0x2001, 0xc943, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xc927, ++ 0x6128, 0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, ++ 0x701b, 0x080c, 0x4e5b, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, ++ 0x0026, 0x080c, 0x7031, 0x2071, 0xc927, 0x713c, 0x81ff, 0x0904, ++ 0x8cc1, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x5f22, 0x1500, ++ 0x0036, 0x2019, 0x0002, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160, ++ 0x080c, 0xc59b, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138, ++ 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c, ++ 0x9613, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0408, ++ 0x6904, 0xa194, 0x4000, 0x0518, 0x6803, 0x1000, 0x6803, 0x0000, ++ 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160, ++ 0x080c, 0xc59b, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138, ++ 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c, ++ 0x9613, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c00, ++ 0x0026, 0x00e6, 0x2071, 0xc927, 0x7048, 0xd084, 0x01d8, 0x713c, ++ 0x81ff, 0x01c0, 0x2071, 0x0100, 0xa188, 0x0007, 0x2114, 0xa28e, ++ 0x0006, 0x1138, 0x7014, 0xa084, 0x0184, 0xa085, 0x0012, 0x7016, ++ 0x0048, 0xa28e, 0x0009, 0x0db0, 0x7014, 0xa084, 0x0184, 0xa085, ++ 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, ++ 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6018, ++ 0x2068, 0x6ca0, 0x2071, 0xc927, 0x7018, 0x2068, 0x8dff, 0x0188, ++ 0x68a0, 0xa406, 0x0118, 0x6854, 0x2068, 0x0cc0, 0x6010, 0x2060, ++ 0x643c, 0x6540, 0x6648, 0x2d60, 0x080c, 0x54ae, 0x0110, 0xa085, ++ 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x1200, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x781c, 0xa086, 0x0004, 0x1110, ++ 0x6098, 0x0018, 0x2001, 0xc615, 0x2004, 0x20a2, 0x7834, 0x20a2, ++ 0x7838, 0x20a2, 0x20a9, 0x0010, 0xa006, 0x20a2, 0x1f04, 0x8d35, ++ 0x20a2, 0x20a2, 0x60c3, 0x002c, 0x080c, 0x8be2, 0x0005, 0x0156, ++ 0x0146, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0f00, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, ++ 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, ++ 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, ++ 0x2011, 0xc640, 0x2019, 0xc641, 0x23a6, 0x22a6, 0xa398, 0x0002, ++ 0xa290, 0x0002, 0x1f04, 0x8d64, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x001c, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, ++ 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x8434, 0x080c, ++ 0x844a, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0015, 0x2098, ++ 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, ++ 0x60c2, 0x080c, 0x8be2, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x6200, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, ++ 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, ++ 0x0026, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x7810, 0xa080, 0x0000, ++ 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, ++ 0x53a6, 0x8003, 0x60c2, 0x080c, 0x8be2, 0x002e, 0x001e, 0x014e, ++ 0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2071, 0xc927, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xae8f, ++ 0x1110, 0x080c, 0x9c09, 0x600c, 0x0006, 0x080c, 0xb056, 0x080c, ++ 0x95e3, 0x080c, 0x8fb7, 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, 0xc927, 0x7024, ++ 0x2060, 0x8cff, 0x05a0, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, ++ 0x7024, 0x2009, 0x0013, 0x080c, 0x9613, 0x20a9, 0x01f4, 0x6824, ++ 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, ++ 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, ++ 0x0001, 0x0010, 0x1f04, 0x8e0f, 0x7804, 0xa084, 0x1000, 0x0120, ++ 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, ++ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, ++ 0xc600, 0x2004, 0xa096, 0x0001, 0x0590, 0xa096, 0x0004, 0x0578, ++ 0x080c, 0x7024, 0x6814, 0xa084, 0x0001, 0x0110, 0x68a7, 0x95f5, ++ 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4e18, 0x080c, 0x6fad, ++ 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, ++ 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, ++ 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8e52, 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, 0xc927, 0x703c, 0x2060, 0x8cff, 0x0904, 0x8f04, 0xa386, ++ 0x0002, 0x1128, 0x6814, 0xa084, 0x0002, 0x0904, 0x8f04, 0x68af, ++ 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x68c7, ++ 0x0000, 0x68cb, 0x0008, 0x080c, 0x7031, 0x080c, 0x22ee, 0x0046, ++ 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, 0xa084, ++ 0x000f, 0xa086, 0x0004, 0x1500, 0x68af, 0x95f5, 0x68c7, 0x0000, ++ 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0020, 0x2071, 0xc992, ++ 0x6814, 0xa084, 0x0184, 0xa085, 0x0012, 0x6816, 0x7803, 0x0008, ++ 0x7003, 0x0000, 0x00fe, 0x00ee, 0xa386, 0x0002, 0x1128, 0x7884, ++ 0xa005, 0x1110, 0x7887, 0x0001, 0x2001, 0xc8f8, 0x2004, 0x200a, ++ 0x004e, 0xa39d, 0x0000, 0x1140, 0x2009, 0x0049, 0x601c, 0xa086, ++ 0x0009, 0x0110, 0x080c, 0x9613, 0x20a9, 0x03e8, 0x6824, 0xd094, ++ 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, ++ 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, 0x0002, ++ 0x0010, 0x1f04, 0x8ee6, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, ++ 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, ++ 0x2091, 0x8000, 0x2069, 0xc927, 0x6a06, 0x012e, 0x00de, 0x0005, ++ 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xc927, 0x6a32, 0x012e, ++ 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126, ++ 0x2071, 0xc927, 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, 0xae54, ++ 0x080c, 0x8fb7, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8, ++ 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156, ++ 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, 0xa006, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x8faf, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089, ++ 0x60c3, 0x0020, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x00e6, ++ 0x2071, 0xc927, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee, ++ 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x8fc3, 0x20a2, 0x20a2, ++ 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, ++ 0x2039, 0x0001, 0x87ff, 0x0904, 0x905f, 0x8cff, 0x0904, 0x905f, ++ 0x601c, 0xa086, 0x0006, 0x1904, 0x905a, 0x88ff, 0x0138, 0x2800, ++ 0xac06, 0x1904, 0x905a, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, ++ 0x1904, 0x905a, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x905a, ++ 0x7024, 0xac06, 0x1598, 0x2069, 0x0100, 0x68c0, 0xa005, 0x1160, ++ 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x7024, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0410, 0x080c, 0x7024, 0x6820, 0xd0b4, ++ 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, ++ 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, ++ 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 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, 0xac91, 0x0110, 0x080c, ++ 0xc141, 0x080c, 0xae54, 0x080c, 0x8fb7, 0x88ff, 0x1190, 0x00ce, ++ 0x0804, 0x8fda, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8fda, 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, 0xc927, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, ++ 0x90d6, 0x601c, 0xa086, 0x0006, 0x1904, 0x90d1, 0x87ff, 0x0128, ++ 0x2700, 0xac06, 0x1904, 0x90d1, 0x0048, 0x6018, 0xa206, 0x1904, ++ 0x90d1, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, 0xac06, ++ 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 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, 0xac91, 0x0110, ++ 0x080c, 0xc141, 0x080c, 0xae54, 0x87ff, 0x1190, 0x00ce, 0x0804, ++ 0x907e, 0x2c78, 0x600c, 0x2060, 0x0804, 0x907e, 0xa006, 0x012e, ++ 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, ++ 0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88, 0x00e6, 0x2071, ++ 0xc927, 0x2001, 0xc600, 0x2004, 0xa086, 0x0002, 0x1118, 0x7007, ++ 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, ++ 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, ++ 0xc927, 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, 0xc927, 0x760c, 0x2660, 0x2678, ++ 0x8cff, 0x0904, 0x91bc, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, ++ 0x1904, 0x91b7, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, 0x68c0, ++ 0xa005, 0x0904, 0x9193, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, ++ 0x90e6, 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, 0xae7e, 0x1158, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x11f0, ++ 0x080c, 0x9c09, 0x00d8, 0x080c, 0x90e6, 0x08c0, 0x080c, 0xae8f, ++ 0x1118, 0x080c, 0x9c09, 0x0090, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, 0x6b4a, ++ 0x6847, 0x0000, 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xb056, ++ 0x080c, 0xae54, 0x080c, 0x8fb7, 0x00ce, 0x0804, 0x9140, 0x2c78, ++ 0x600c, 0x2060, 0x0804, 0x9140, 0x012e, 0x000e, 0x006e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1d30, ++ 0x080c, 0xc141, 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, 0x3908, ++ 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2c61, 0x1118, 0x8210, ++ 0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, 0xa110, ++ 0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, 0x0005, ++ 0x00d6, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, ++ 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2099, ++ 0xc900, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, 0x7878, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x8be2, 0x00de, 0x0005, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 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, 0x8be2, 0x0005, 0x00d6, 0x0016, 0x2f68, ++ 0x2009, 0x0035, 0x080c, 0xb141, 0x1904, 0x929b, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, 0x2068, ++ 0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080, 0x0028, 0x2014, ++ 0x2001, 0xc635, 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, ++ 0xc77b, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x00e8, 0x20a3, ++ 0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xc635, 0x2004, 0xd0ac, ++ 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007e, 0x0240, ++ 0x00d6, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0020, ++ 0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x8be2, ++ 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, 0x001e, ++ 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, 0xa186, ++ 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x9311, 0xa186, 0x0005, ++ 0x0904, 0x92fa, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, 0x0904, ++ 0x9302, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x9379, 0x002e, ++ 0x00de, 0x0005, 0x080c, 0x9335, 0x2009, 0x4000, 0x6800, 0x0002, ++ 0x92db, 0x92e6, 0x92dd, 0x92e6, 0x92e2, 0x92db, 0x92db, 0x92e6, ++ 0x92e6, 0x92e6, 0x92e6, 0x92db, 0x92db, 0x92db, 0x92db, 0x92db, ++ 0x92e6, 0x92db, 0x92e6, 0x080c, 0x1519, 0x6820, 0xd0e4, 0x0110, ++ 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, 0x20a2, ++ 0x682c, 0x20a2, 0x0804, 0x932b, 0x080c, 0x9335, 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, 0x8be2, 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, 0x0056, ++ 0x0066, 0x20a1, 0x020b, 0x080c, 0x845b, 0xa006, 0x20a3, 0x0200, ++ 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, ++ 0x0268, 0x00d6, 0x2069, 0xc61c, 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, ++ 0xc77b, 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, 0x845b, 0x20a3, 0x0100, 0x20a3, ++ 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, ++ 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83b7, 0x20a3, 0x1400, ++ 0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, ++ 0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, ++ 0x0000, 0x60c3, 0x0010, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, ++ 0x080c, 0x8453, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, ++ 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x0146, ++ 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, 0x8be2, 0x014e, ++ 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, ++ 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, ++ 0x0078, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0300, ++ 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x6234, 0x22a2, ++ 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x8bd1, 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, 0x8bec, ++ 0x080c, 0x701b, 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, ++ 0x609b, 0x0000, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x20a3, 0x22ff, 0x20a3, 0xffff, 0x00d6, 0x2069, 0xc61c, 0x2da6, ++ 0x8d68, 0x2da6, 0x00de, 0x20a3, 0x0138, 0x20a3, 0x0000, 0x0026, ++ 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x20a3, 0x5400, 0x20a3, ++ 0x0000, 0x080c, 0x768f, 0x11b8, 0x0016, 0x7810, 0xa080, 0x000d, ++ 0x20a9, 0x0014, 0x200c, 0x810f, 0x21a2, 0x8000, 0x1f04, 0x948a, ++ 0x20a9, 0x0012, 0x2001, 0x0000, 0x20a3, 0x0000, 0x1f04, 0x9494, ++ 0x001e, 0x0804, 0x9502, 0x7810, 0x0016, 0x00c6, 0x00d6, 0x7810, ++ 0x2068, 0x2061, 0xc600, 0x6070, 0xa084, 0x00ff, 0x6968, 0x810f, ++ 0xa18c, 0xff00, 0xa105, 0x20a2, 0x6074, 0x20a2, 0x6968, 0xa18c, ++ 0xff00, 0x21a2, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2009, 0xc605, ++ 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94b8, 0x20a9, 0x0004, 0x2009, ++ 0xc601, 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94c1, 0x20a9, 0x0004, ++ 0x2d08, 0xa188, 0x001d, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, ++ 0x94cb, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x0021, 0x2104, 0x8007, ++ 0x20a2, 0x8108, 0x1f04, 0x94d6, 0x080c, 0x7694, 0x1138, 0x20a9, ++ 0x0008, 0x20a3, 0x0000, 0x1f04, 0x94e1, 0x0050, 0x20a9, 0x0008, ++ 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x94ea, ++ 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, 0x8007, 0x20a2, ++ 0x8108, 0x1f04, 0x94f5, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x20a1, ++ 0x020b, 0x080c, 0x83bf, 0x20a3, 0x5500, 0x20a3, 0x0000, 0x7810, ++ 0x0016, 0x00c6, 0x00d6, 0x7810, 0x2068, 0x686c, 0xa084, 0x00ff, ++ 0x6968, 0x810f, 0xa18c, 0xff00, 0xa105, 0x20a2, 0x696c, 0xa18c, ++ 0xff00, 0x6870, 0xa084, 0x00ff, 0xa105, 0x20a2, 0x6968, 0xa18c, ++ 0xff00, 0x2061, 0xc600, 0x6070, 0xa084, 0x00ff, 0xa10d, 0x21a2, ++ 0x6174, 0x21a2, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x001d, 0x2104, ++ 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9537, 0x20a9, 0x0004, 0x2d08, ++ 0xa188, 0x0021, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9542, ++ 0x20a9, 0x0004, 0x2009, 0xc605, 0x2104, 0x20a2, 0x8108, 0x1f04, ++ 0x954c, 0x20a9, 0x0004, 0x2009, 0xc601, 0x2104, 0x20a2, 0x8108, ++ 0x1f04, 0x9555, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, ++ 0x8007, 0x20a2, 0x8108, 0x1f04, 0x955f, 0x080c, 0x7694, 0x1138, ++ 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x956a, 0x0050, 0x20a9, ++ 0x0008, 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, ++ 0x9573, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x2061, 0xce00, 0x2a70, ++ 0x7068, 0x704a, 0x704f, 0xce00, 0x0005, 0x00e6, 0x0126, 0x2071, ++ 0xc600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, 0x0608, 0x704c, ++ 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, ++ 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, 0x6003, 0x0008, ++ 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, 0x754e, ++ 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xce00, 0x0cc0, ++ 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xc600, 0x7548, 0xa582, 0x0010, ++ 0x0600, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, ++ 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, ++ 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, ++ 0x1228, 0x754e, 0xa085, 0x0001, 0x00ee, 0x0005, 0x704f, 0xce00, ++ 0x0cc8, 0xa006, 0x0cc8, 0xac82, 0xce00, 0x0a0c, 0x1519, 0x2001, ++ 0xc617, 0x2004, 0xac02, 0x1a0c, 0x1519, 0xa006, 0x6006, 0x600a, ++ 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, ++ 0x6052, 0x6056, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, ++ 0x603a, 0x603e, 0x6026, 0x2061, 0xc600, 0x6048, 0x8000, 0x604a, ++ 0xa086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x7e94, 0x012e, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x0002, 0x9622, ++ 0x9631, 0x964c, 0x9667, 0xb189, 0xb1a4, 0xb1bf, 0x9622, 0x9631, ++ 0x7699, 0x9682, 0xa186, 0x0013, 0x1128, 0x080c, 0x7db1, 0x080c, ++ 0x7e94, 0x0005, 0xa18e, 0x0047, 0x1118, 0xa016, 0x080c, 0x1870, ++ 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, ++ 0x006e, 0x0005, 0x964a, 0x9a78, 0x9c43, 0x964a, 0x9cc0, 0x9740, ++ 0x964a, 0x964a, 0x9a0a, 0xa126, 0x964a, 0x964a, 0x964a, 0x964a, ++ 0x964a, 0x964a, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, ++ 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0x9665, 0xa759, 0x9665, ++ 0x9665, 0x9665, 0x9665, 0x9665, 0x9665, 0xa704, 0xa8c5, 0x9665, ++ 0xa786, 0xa7fd, 0xa786, 0xa7fd, 0x9665, 0x080c, 0x1519, 0x0066, ++ 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, ++ 0x9680, 0xa167, 0xa231, 0xa36c, 0xa4c8, 0x9680, 0x9680, 0x9680, ++ 0xa141, 0xa6b4, 0xa6b7, 0x9680, 0x9680, 0x9680, 0x9680, 0xa6e1, ++ 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, ++ 0x0013, 0x006e, 0x0005, 0x969b, 0x969b, 0x969b, 0x96c9, 0x9716, ++ 0x969b, 0x969b, 0x969b, 0x969d, 0x969b, 0x969b, 0x969b, 0x969b, ++ 0x969b, 0x969b, 0x969b, 0x080c, 0x1519, 0xa186, 0x0003, 0x190c, ++ 0x1519, 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, 0x2068, ++ 0x080c, 0x79fc, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f6e, 0x012e, ++ 0x0005, 0xa182, 0x0047, 0x0002, 0x96d5, 0x96d5, 0x96d7, 0x96f0, ++ 0x96d5, 0x96d5, 0x96d5, 0x96d5, 0x9702, 0x080c, 0x1519, 0x00d6, ++ 0x0016, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6003, 0x0004, 0x6110, ++ 0x2168, 0x684f, 0x0020, 0x685c, 0x685a, 0x6874, 0x687e, 0x6878, ++ 0x6882, 0x6897, 0x0000, 0x689b, 0x0000, 0x001e, 0x00de, 0x0005, ++ 0x080c, 0x7e47, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, 0x0120, ++ 0x684b, 0x0006, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, ++ 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, 0x6110, ++ 0x2168, 0x080c, 0xac91, 0x0120, 0x684b, 0x0029, 0x080c, 0x580a, ++ 0x00de, 0x080c, 0x95e3, 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0047, ++ 0x0002, 0x9724, 0x9733, 0x9722, 0x9722, 0x9722, 0x9722, 0x9722, ++ 0x9722, 0x9722, 0x080c, 0x1519, 0x00d6, 0x6010, 0x2068, 0x684c, ++ 0xc0f4, 0x684e, 0x00de, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x00d6, 0x6110, 0x2168, 0x684b, 0x0000, ++ 0x6853, 0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x0005, ++ 0xa1b6, 0x0015, 0x1118, 0x080c, 0x95e3, 0x0030, 0xa1b6, 0x0016, ++ 0x190c, 0x1519, 0x080c, 0x95e3, 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, 0x975b, 0x00e6, ++ 0x080c, 0xac91, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, ++ 0x0103, 0x00ee, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x0036, 0x7330, ++ 0xa386, 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817, ++ 0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6837, ++ 0x0103, 0x6b32, 0x080c, 0x95e3, 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, 0x95e3, 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, 0x4ecb, 0x00e6, 0x080c, 0xac91, 0x0140, 0x6010, ++ 0x2070, 0x7007, 0x0000, 0x7034, 0x70b2, 0x7037, 0x0103, 0x00ee, ++ 0x080c, 0x95e3, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, ++ 0xa086, 0x0200, 0x0110, 0x2009, 0x0001, 0x00d6, 0x6010, 0xa06d, ++ 0x090c, 0x1519, 0x694a, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, ++ 0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016, ++ 0x2009, 0x0035, 0x080c, 0xb141, 0x001e, 0x1168, 0x0026, 0x6228, ++ 0x2268, 0x002e, 0x2071, 0xcc8c, 0x6b1c, 0xa386, 0x0003, 0x0130, ++ 0xa386, 0x0006, 0x0128, 0x080c, 0x95e3, 0x0020, 0x0031, 0x0010, ++ 0x080c, 0x98d3, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078, ++ 0xa186, 0x0015, 0x0904, 0x98ba, 0xa18e, 0x0016, 0x1904, 0x98d1, ++ 0x700c, 0xa08c, 0xff00, 0xa186, 0x1700, 0x0120, 0xa186, 0x0300, ++ 0x1904, 0x9899, 0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, 0x0904, ++ 0x987d, 0x0804, 0x98cf, 0x6808, 0xa086, 0xffff, 0x1904, 0x98bc, ++ 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, ++ 0xa106, 0x1904, 0x98bc, 0x7980, 0x7814, 0xa106, 0x1904, 0x98bc, ++ 0x080c, 0xae48, 0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, ++ 0x784e, 0x0026, 0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x783f, ++ 0x7854, 0xa20a, 0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, ++ 0x00c6, 0x2d60, 0x080c, 0xaa40, 0x00ce, 0x0804, 0x98cf, 0x00c6, ++ 0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4fa6, 0x0010, ++ 0x080c, 0x51dd, 0x00de, 0x00ce, 0x1904, 0x98bc, 0x00c6, 0x2d60, ++ 0x080c, 0x95e3, 0x00ce, 0x0804, 0x98cf, 0x00c6, 0x080c, 0xaf0d, ++ 0x0190, 0x6013, 0x0000, 0x6818, 0x601a, 0x080c, 0xb05e, 0x601f, ++ 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x95e3, 0x00ce, 0x080c, ++ 0x9613, 0x00ce, 0x04e0, 0x2001, 0xc8ff, 0x2004, 0x683e, 0x00ce, ++ 0x04b0, 0x7008, 0xa086, 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc, ++ 0x2102, 0x00c6, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce, ++ 0x00f0, 0x700c, 0xa086, 0x2a00, 0x1138, 0x2001, 0xc8ff, 0x2004, ++ 0x683e, 0x00a8, 0x0481, 0x00a8, 0x8fff, 0x090c, 0x1519, 0x00c6, ++ 0x00d6, 0x2d60, 0x2f68, 0x6837, 0x0103, 0x684b, 0x0003, 0x080c, ++ 0xa934, 0x080c, 0xae48, 0x080c, 0xae54, 0x00de, 0x00ce, 0x080c, ++ 0x95e3, 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xc8ff, ++ 0x2004, 0x683e, 0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, ++ 0x2060, 0x080c, 0xc3e2, 0x080c, 0x7103, 0x080c, 0x95e3, 0x00ce, ++ 0x080c, 0x95e3, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, ++ 0x7b7c, 0xd2f4, 0x0130, 0x2001, 0xc8ff, 0x2004, 0x683e, 0x0804, ++ 0x994d, 0x00c6, 0x2d60, 0x080c, 0xa954, 0x00ce, 0x6804, 0xa086, ++ 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, ++ 0x0050, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce, 0x04f0, 0x6800, ++ 0xa086, 0x000f, 0x01c8, 0x8fff, 0x090c, 0x1519, 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, 0xaf9a, 0x080c, 0x7e94, 0x0010, 0x080c, 0x95e3, 0x004e, ++ 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, ++ 0x6a1c, 0xa286, 0x0007, 0x0904, 0x99b1, 0xa286, 0x0002, 0x0904, ++ 0x99b1, 0xa286, 0x0000, 0x0904, 0x99b1, 0x6808, 0x6338, 0xa306, ++ 0x1904, 0x99b1, 0x2071, 0xcc8c, 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, 0xac91, 0x090c, 0x1519, 0x6853, 0x0003, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x00ce, 0x0030, 0x6034, 0x2070, 0x2001, 0xc8ff, 0x2004, ++ 0x703e, 0x080c, 0x95e3, 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, 0xa103, ++ 0x002e, 0x003e, 0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90, ++ 0x000c, 0xa290, 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c, ++ 0xa103, 0x002e, 0x003e, 0x015e, 0x1150, 0x7038, 0x680a, 0x703c, ++ 0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, 0x0804, 0x9767, 0x080c, ++ 0x2e46, 0x00c6, 0x080c, 0x958d, 0x2f00, 0x601a, 0x6013, 0x0000, ++ 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, ++ 0x080c, 0x5291, 0x080c, 0x52be, 0x080c, 0x79df, 0x080c, 0x7e94, ++ 0x00ce, 0x0c10, 0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0xa1b2, ++ 0x0040, 0x1a04, 0x9a6e, 0x0002, 0x9a62, 0x9a56, 0x9a62, 0x9a62, ++ 0x9a62, 0x9a62, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a54, 0x9a62, 0x9a62, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a62, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a62, 0x9a54, 0x9a54, 0x080c, 0x1519, 0x6003, 0x0001, ++ 0x6106, 0x080c, 0x79df, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, ++ 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x79df, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x2600, 0x0002, ++ 0x9a62, 0x9a62, 0x9a76, 0x9a62, 0x9a62, 0x9a76, 0x080c, 0x1519, ++ 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013, 0x0904, ++ 0x9b28, 0xa1b6, 0x0027, 0x1904, 0x9aee, 0x080c, 0x7db1, 0x6004, ++ 0x080c, 0xae7e, 0x0190, 0x080c, 0xae8f, 0x0904, 0x9ae8, 0xa08e, ++ 0x0021, 0x0904, 0x9aeb, 0xa08e, 0x0022, 0x0904, 0x9ae8, 0xa08e, ++ 0x003d, 0x0904, 0x9aeb, 0x0804, 0x9ae1, 0x080c, 0x2e6c, 0x2001, ++ 0x0007, 0x080c, 0x5291, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, ++ 0x9c09, 0xa186, 0x007e, 0x1148, 0x2001, 0xc635, 0x2014, 0xc285, ++ 0x080c, 0x5f22, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, ++ 0x2110, 0x0026, 0x2019, 0x0028, 0x080c, 0x9132, 0x002e, 0x080c, ++ 0xc4e4, 0x003e, 0x002e, 0x001e, 0x0016, 0x0026, 0x0036, 0x2110, ++ 0x2019, 0x0028, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, ++ 0x7a0e, 0x00c6, 0x6018, 0xa065, 0x0110, 0x080c, 0x553e, 0x00ce, ++ 0x2c08, 0x080c, 0xbef7, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, ++ 0x5300, 0x080c, 0xb056, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, ++ 0x080c, 0x9c09, 0x0cb0, 0x080c, 0x9c37, 0x0c98, 0xa186, 0x0014, ++ 0x1db0, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x080c, 0xae7e, 0x1188, ++ 0x080c, 0x2e6c, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x9c09, ++ 0xa186, 0x007e, 0x1128, 0x2001, 0xc635, 0x200c, 0xc185, 0x2102, ++ 0x08c0, 0x080c, 0xae8f, 0x1118, 0x080c, 0x9c09, 0x0890, 0x6004, ++ 0xa08e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071, 0xc6a2, 0x2079, ++ 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, ++ 0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, 0x9c09, 0x0804, 0x9ae1, ++ 0xa0b2, 0x0040, 0x1a04, 0x9beb, 0x2008, 0x0002, 0x9b70, 0x9b71, ++ 0x9b74, 0x9b77, 0x9b7a, 0x9b7d, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b80, 0x9b8f, 0x9b6e, 0x9b91, ++ 0x9b8f, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8f, 0x9b8f, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9bcb, 0x9b8f, 0x9b6e, 0x9b8b, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8c, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8f, 0x9bc2, 0x9b6e, 0x080c, 0x1519, ++ 0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, ++ 0x0005, 0x0430, 0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, ++ 0x080c, 0x7db1, 0x6003, 0x0005, 0x2001, 0xc8ff, 0x2004, 0x603e, ++ 0x080c, 0x7e94, 0x00a0, 0x0018, 0x0010, 0x080c, 0x5291, 0x0804, ++ 0x9bdc, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x2001, ++ 0xc8ff, 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x7e94, 0x0005, ++ 0x080c, 0x5291, 0x080c, 0x7db1, 0x6003, 0x0002, 0x2001, 0xc8ff, ++ 0x2004, 0x603e, 0x0036, 0x2019, 0xc65d, 0x2304, 0xa084, 0xff00, ++ 0x1120, 0x2001, 0xc8fd, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, ++ 0x0ec0, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, ++ 0x7e94, 0x08e8, 0x080c, 0x7db1, 0x080c, 0xb056, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xc6a2, 0x2079, ++ 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x080c, 0x7db1, 0x080c, ++ 0x95e3, 0x080c, 0x7e94, 0x0818, 0x080c, 0x7db1, 0x2001, 0xc8ff, ++ 0x2004, 0x603e, 0x6003, 0x0002, 0x2001, 0xc8fd, 0x2004, 0x6016, ++ 0x080c, 0x7e94, 0x0005, 0x2600, 0x2008, 0x0002, 0x9bf6, 0x9bdc, ++ 0x9bf4, 0x9bdc, 0x9bdc, 0x9bf4, 0x080c, 0x1519, 0x080c, 0x7db1, ++ 0x00d6, 0x6010, 0x2068, 0x080c, 0x768f, 0x1118, 0x080c, 0x1619, ++ 0x0010, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, ++ 0x0005, 0x00e6, 0x0026, 0x0016, 0x080c, 0xac91, 0x0508, 0x6010, ++ 0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, 0x0030, 0x2009, ++ 0x0000, 0x2011, 0x4005, 0x080c, 0xb10d, 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, 0x1519, 0x6604, 0xa6b6, ++ 0x0043, 0x1120, 0x080c, 0xb0c9, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x0033, 0x1120, 0x080c, 0xb079, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x0028, 0x1120, 0x080c, 0xaebf, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x0029, 0x1120, 0x080c, 0xaed6, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x001f, 0x1118, 0x080c, 0x974d, 0x04d8, 0x6604, 0xa6b6, 0x0000, ++ 0x1118, 0x080c, 0x99b7, 0x04a0, 0x6604, 0xa6b6, 0x0022, 0x1118, ++ 0x080c, 0x9775, 0x0468, 0x6604, 0xa6b6, 0x0035, 0x1118, 0x080c, ++ 0x97f2, 0x0430, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, 0x9953, ++ 0x00f8, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x978f, 0x00c0, ++ 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x97af, 0x0088, 0x6604, ++ 0xa6b6, 0x0041, 0x1118, 0x080c, 0x97dc, 0x0050, 0xa1b6, 0x0015, ++ 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, 0x0804, 0x9e93, ++ 0x0005, 0x080c, 0x962a, 0x0ce0, 0x9cda, 0x9cdd, 0x9cda, 0x9d21, ++ 0x9cda, 0x9e1a, 0x9ea1, 0x9cda, 0x9cda, 0x9e6b, 0x9cda, 0x9e81, ++ 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, ++ 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x95e3, 0x0005, 0x080c, ++ 0x95e3, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xc600, ++ 0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xbece, 0x11b0, 0x00d6, ++ 0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, ++ 0xc0c5, 0x6802, 0x00e9, 0x00de, 0x2001, 0x0006, 0x080c, 0x5291, ++ 0x080c, 0x2e6c, 0x080c, 0x95e3, 0x0088, 0x2001, 0x000a, 0x080c, ++ 0x5291, 0x080c, 0x2e6c, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x00ee, 0x0005, ++ 0x6800, 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x527f, 0x2069, ++ 0xc652, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x52be, ++ 0x0005, 0x00d6, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, 0x1904, ++ 0x9df0, 0x6018, 0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, ++ 0x9fc3, 0x0804, 0x9d8f, 0x080c, 0x9fb9, 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, 0x5291, 0x080c, ++ 0x2e6c, 0x080c, 0x95e3, 0x0804, 0x9df3, 0x00e6, 0x2071, 0xc635, ++ 0x2e04, 0xd09c, 0x0188, 0x2071, 0xcc80, 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, 0xb10d, 0x0840, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003, ++ 0x0001, 0x6007, 0x0003, 0x080c, 0x79df, 0x0804, 0x9df3, 0x685c, ++ 0xd0e4, 0x01d8, 0x080c, 0xb009, 0x080c, 0x5f22, 0x0118, 0xd0dc, ++ 0x1904, 0x9d4b, 0x2011, 0xc635, 0x2204, 0xc0ad, 0x2012, 0x2001, ++ 0xc8d6, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, ++ 0x2a1c, 0x78e2, 0x00fe, 0x0804, 0x9d4b, 0x080c, 0xb03f, 0x2011, ++ 0xc635, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xc023, 0x000e, ++ 0x1904, 0x9d4b, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x5291, ++ 0x2001, 0x0000, 0x080c, 0x527f, 0x00c6, 0x2009, 0x00ef, 0x00f6, ++ 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x00fe, 0x080c, 0x29f1, ++ 0x00f6, 0x2079, 0xc600, 0x7976, 0x2100, 0x2009, 0x0000, 0x080c, ++ 0x29c7, 0x7952, 0x00fe, 0x8108, 0x080c, 0x52e1, 0x2c00, 0x00ce, ++ 0x1904, 0x9d4b, 0x601a, 0x2001, 0x0002, 0x080c, 0x5291, 0x601f, ++ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x0018, ++ 0x2001, 0x0001, 0x0011, 0x00de, 0x0005, 0x0066, 0x2030, 0xa005, ++ 0x0170, 0x2001, 0x0007, 0x080c, 0x5291, 0x2001, 0xc600, 0x2004, ++ 0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x52be, 0x2600, ++ 0xa005, 0x1150, 0x6010, 0xa080, 0x000e, 0x2004, 0xd0fc, 0x1120, ++ 0x2011, 0x8014, 0x080c, 0x407d, 0x080c, 0x2e6c, 0x080c, 0x95e3, ++ 0x006e, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, 0xc600, 0x7084, ++ 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003, 0x1128, 0x6010, ++ 0xa005, 0x1110, 0x080c, 0x40ef, 0x00d6, 0x6018, 0x2068, 0x080c, ++ 0x53df, 0x080c, 0x9d10, 0x00de, 0x080c, 0xa072, 0x1550, 0x00d6, ++ 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, 0x2001, 0x0006, ++ 0x080c, 0x5291, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, 0xa084, ++ 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, 0x2009, 0x0000, ++ 0x2011, 0x4000, 0x080c, 0xb10d, 0x0030, 0x7007, 0x0000, 0x7037, ++ 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2e6c, 0x080c, 0x95e3, ++ 0x0030, 0x080c, 0x9c09, 0x2001, 0x0000, 0x080c, 0x9df5, 0x001e, ++ 0x002e, 0x00ee, 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014, ++ 0x1158, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, ++ 0x0001, 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, ++ 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, ++ 0x0007, 0x080c, 0x5291, 0x080c, 0x95e3, 0x0020, 0x2001, 0x0001, ++ 0x080c, 0x9df5, 0x0005, 0x000b, 0x0005, 0x9cda, 0x9eac, 0x9cda, ++ 0x9ee2, 0x9cda, 0x9f6f, 0x9ea1, 0x9cd7, 0x9cda, 0x9f84, 0x9cda, ++ 0x9f96, 0x6604, 0xa686, 0x0003, 0x0904, 0x9e1a, 0xa6b6, 0x001e, ++ 0x1110, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x00c6, 0x080c, 0x9fa8, ++ 0x1178, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, ++ 0x5291, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x00f8, ++ 0x2009, 0xcc8e, 0x2104, 0xa086, 0x0009, 0x1160, 0x6018, 0x2068, ++ 0x6840, 0xa084, 0x00ff, 0xa005, 0x0170, 0x8001, 0x6842, 0x6017, ++ 0x000a, 0x0068, 0x2009, 0xcc8f, 0x2104, 0xa084, 0xff00, 0xa086, ++ 0x1900, 0x1108, 0x08d0, 0x2001, 0x0001, 0x080c, 0x9df5, 0x00ce, ++ 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x9fb6, 0x00d6, ++ 0x2069, 0xc8e5, 0x2d04, 0xa005, 0x0168, 0x6018, 0x2068, 0x68a0, ++ 0xa086, 0x007e, 0x1138, 0x2069, 0xc61d, 0x2d04, 0x8000, 0x206a, ++ 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000, 0x080c, 0x527f, ++ 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x79df, 0x0490, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x00de, 0x0108, 0x6a34, 0x080c, 0x9c09, 0x2009, 0xcc8e, 0x2134, ++ 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0510, 0xa686, 0x000b, 0x01c8, ++ 0x2009, 0xcc8f, 0x2104, 0xa084, 0xff00, 0x1118, 0xa686, 0x0009, ++ 0x01b0, 0xa086, 0x1900, 0x1168, 0xa686, 0x0009, 0x0180, 0x2001, ++ 0x0004, 0x080c, 0x5291, 0x2001, 0x0028, 0x6016, 0x6007, 0x004b, ++ 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x002e, 0x0005, 0x00d6, ++ 0xa286, 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0xac91, 0x0148, ++ 0x6834, 0xa086, 0x0139, 0x0118, 0x6838, 0xd0fc, 0x0110, 0x00de, ++ 0x0c40, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0140, ++ 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x00de, 0x08e8, ++ 0x68a0, 0xa086, 0x007e, 0x1138, 0x00e6, 0x2071, 0xc600, 0x080c, ++ 0x4f02, 0x00ee, 0x0010, 0x080c, 0x2e46, 0x00de, 0x0850, 0x080c, ++ 0x9fb6, 0x1158, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003, 0x0001, ++ 0x6007, 0x0003, 0x080c, 0x79df, 0x0030, 0x080c, 0x9c09, 0x2001, ++ 0x0000, 0x080c, 0x9df5, 0x0005, 0x0489, 0x1158, 0x2001, 0x0008, ++ 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x79df, ++ 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x0005, 0x00f9, 0x1158, ++ 0x2001, 0x000a, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0001, ++ 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x0005, ++ 0x2009, 0xcc8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, 0xcc8f, ++ 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, 0x0001, ++ 0x0005, 0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, 0x534c, ++ 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, ++ 0x6018, 0x2068, 0x2071, 0xc635, 0x2e04, 0xa085, 0x0003, 0x2072, ++ 0x080c, 0xa047, 0x0560, 0x2009, 0xc635, 0x2104, 0xc0cd, 0x200a, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, ++ 0x002a, 0x080c, 0xc190, 0x2001, 0xc60c, 0x200c, 0xc195, 0x2102, ++ 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x2e19, 0x2071, 0xc600, ++ 0x080c, 0x2c62, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f, ++ 0x080c, 0x2f41, 0x8108, 0x1f04, 0x9ff8, 0x015e, 0x00ce, 0x080c, ++ 0x9fb9, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xcc80, 0x2079, ++ 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xc61c, 0x206a, 0x78e6, ++ 0x0006, 0x8e70, 0x2e04, 0x2069, 0xc61d, 0x206a, 0x78ea, 0x7832, ++ 0x7836, 0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, 0xc628, ++ 0x200a, 0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x29f1, 0x080c, ++ 0x5f22, 0x0170, 0x2069, 0xcc8e, 0x2071, 0xc8f9, 0x6810, 0x2072, ++ 0x6814, 0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, 0xb009, ++ 0x0040, 0x2001, 0x0006, 0x080c, 0x5291, 0x080c, 0x2e6c, 0x080c, ++ 0x95e3, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, ++ 0x0036, 0x00e6, 0x0156, 0x2019, 0xc628, 0x231c, 0x83ff, 0x01e8, ++ 0x2071, 0xcc80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, ++ 0xa205, 0xa306, 0x1190, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9, ++ 0x0004, 0x080c, 0xa103, 0x1148, 0x2011, 0xcc9a, 0xad98, 0x0006, ++ 0x20a9, 0x0004, 0x080c, 0xa103, 0x1100, 0x015e, 0x00ee, 0x003e, ++ 0x002e, 0x0005, 0x00e6, 0x2071, 0xcc8c, 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, 0xc930, 0x252c, 0x2021, 0xc936, ++ 0x2424, 0x2061, 0xce00, 0x2071, 0xc600, 0x7248, 0x7068, 0xa202, ++ 0x16f0, 0x080c, 0xc1b8, 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580, ++ 0xa786, 0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, 0xac06, ++ 0x0538, 0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, 0x1953, ++ 0xa786, 0x0008, 0x1148, 0x080c, 0xae8f, 0x1130, 0x00ce, 0x080c, ++ 0x9c09, 0x080c, 0xae54, 0x00a0, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x00ce, ++ 0xace0, 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0xa0a5, 0x012e, ++ 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, ++ 0x0005, 0xa786, 0x0006, 0x1118, 0x080c, 0xc141, 0x0c30, 0xa786, ++ 0x0009, 0x1128, 0x2009, 0x0106, 0x080c, 0x9613, 0x0c00, 0xa786, ++ 0x000a, 0x09a0, 0x0888, 0x220c, 0x2304, 0xa106, 0x1130, 0x8210, ++ 0x8318, 0x1f04, 0xa103, 0xa006, 0x0005, 0x2304, 0xa102, 0x0218, ++ 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, 0x0005, ++ 0x220c, 0x810f, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318, 0x1f04, ++ 0xa118, 0xa006, 0x0005, 0xa18d, 0x0001, 0x0005, 0x6004, 0xa08a, ++ 0x0080, 0x1a0c, 0x1519, 0x080c, 0xae7e, 0x0120, 0x080c, 0xae8f, ++ 0x0168, 0x0028, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x0138, 0x080c, ++ 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x9c09, ++ 0x0cb0, 0xa182, 0x0040, 0x0002, 0xa157, 0xa157, 0xa157, 0xa157, ++ 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa159, ++ 0xa159, 0xa159, 0xa159, 0xa157, 0xa157, 0xa157, 0xa159, 0x080c, ++ 0x1519, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0xa186, ++ 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0xa1f3, 0xa186, ++ 0x0027, 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6110, ++ 0x2168, 0x080c, 0xac91, 0x0168, 0x6837, 0x0103, 0x684b, 0x0029, ++ 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x580a, 0x080c, ++ 0xae48, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0xa186, ++ 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, 0x0428, 0xa186, 0x0046, ++ 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, 0x0047, 0x190c, 0x1519, ++ 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, 0x0126, 0x2091, 0x2800, ++ 0x0006, 0x0016, 0x0026, 0x080c, 0x7873, 0x002e, 0x001e, 0x000e, ++ 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804, 0xa231, ++ 0x080c, 0x962a, 0x0005, 0x0002, 0xa1d1, 0xa1cf, 0xa1cf, 0xa1cf, ++ 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1ec, ++ 0xa1ec, 0xa1ec, 0xa1ec, 0xa1cf, 0xa1ec, 0xa1cf, 0xa1ec, 0x080c, ++ 0x1519, 0x080c, 0x7db1, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, ++ 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, ++ 0xc0ec, 0x6852, 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, ++ 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x0005, 0x0002, 0xa209, 0xa207, 0xa207, 0xa207, ++ 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa21b, ++ 0xa21b, 0xa21b, 0xa21b, 0xa207, 0xa22a, 0xa207, 0xa21b, 0x080c, ++ 0x1519, 0x080c, 0x7db1, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, ++ 0x0002, 0x080c, 0x7e94, 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, ++ 0x0400, 0x200a, 0x0005, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, ++ 0x6016, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, 0x000f, 0x080c, ++ 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, ++ 0x0005, 0xa182, 0x0040, 0x0002, 0xa247, 0xa247, 0xa247, 0xa247, ++ 0xa247, 0xa249, 0xa32e, 0xa35d, 0xa247, 0xa247, 0xa247, 0xa247, ++ 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0x080c, ++ 0x1519, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xcc80, 0x7124, ++ 0x610a, 0x2071, 0xcc8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, ++ 0x86ff, 0x0904, 0xa2f7, 0xa68c, 0x0c00, 0x0518, 0x00f6, 0x2c78, ++ 0x080c, 0x56c3, 0x00fe, 0x01c8, 0x684c, 0xd0ac, 0x01b0, 0x6020, ++ 0xd0dc, 0x1198, 0x6850, 0xd0bc, 0x1180, 0x7318, 0x6814, 0xa306, ++ 0x1904, 0xa30a, 0x731c, 0x6810, 0xa31e, 0x0138, 0xd6d4, 0x0904, ++ 0xa30a, 0x6b14, 0xa305, 0x1904, 0xa30a, 0x7318, 0x6b62, 0x731c, ++ 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0518, 0xa186, 0x0028, ++ 0x1128, 0x080c, 0xae6d, 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, 0xcc99, 0x2004, 0xa005, ++ 0x1118, 0xc6c4, 0x0804, 0xa258, 0x7328, 0x732c, 0x6b56, 0x83ff, ++ 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, ++ 0x2019, 0xcc98, 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, ++ 0x0904, 0xa31d, 0x7124, 0x695a, 0x81ff, 0x0904, 0xa31d, 0xa192, ++ 0x0021, 0x1260, 0x2071, 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90, ++ 0x001d, 0x080c, 0xa944, 0x080c, 0xb16e, 0x04b8, 0x6838, 0xd0fc, ++ 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68, 0x00f6, 0x2d78, 0x080c, ++ 0xa8e9, 0x00fe, 0x080c, 0xb16e, 0x080c, 0xa934, 0x0440, 0x00f6, ++ 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0190, 0x684c, 0xd0ac, 0x0178, ++ 0x6020, 0xd0dc, 0x1160, 0x6850, 0xd0bc, 0x1148, 0x6810, 0x6914, ++ 0xa105, 0x0128, 0x080c, 0xaf6c, 0x00de, 0x00ee, 0x00f0, 0x684b, ++ 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0130, 0x6810, ++ 0x6914, 0xa115, 0x0110, 0x080c, 0xa4ba, 0x080c, 0x580a, 0x6218, ++ 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x080c, 0xaf3a, ++ 0x00de, 0x00ee, 0x1110, 0x080c, 0x95e3, 0x0005, 0x00f6, 0x6003, ++ 0x0003, 0x2079, 0xcc8c, 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, 0x2068, ++ 0x080c, 0x79fc, 0x080c, 0x7f6e, 0x0005, 0x2001, 0xc8ff, 0x2004, ++ 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, ++ 0x2c10, 0x080c, 0x1870, 0x0005, 0xa182, 0x0040, 0x0002, 0xa382, ++ 0xa382, 0xa382, 0xa382, 0xa382, 0xa384, 0xa417, 0xa382, 0xa382, ++ 0xa42d, 0xa491, 0xa382, 0xa382, 0xa382, 0xa382, 0xa4a0, 0xa382, ++ 0xa382, 0xa382, 0x080c, 0x1519, 0x0076, 0x00f6, 0x00e6, 0x00d6, ++ 0x2071, 0xcc8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, ++ 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, ++ 0x8211, 0x6a3e, 0x86ff, 0x0904, 0xa412, 0xa694, 0xff00, 0xa284, ++ 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, ++ 0x0904, 0xa412, 0x080c, 0x1602, 0x090c, 0x1519, 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, 0xcc98, ++ 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, 0x01d8, 0x7124, ++ 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xcc98, ++ 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa944, 0x0050, ++ 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, ++ 0x080c, 0xa8e9, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6, ++ 0x6003, 0x0003, 0x2079, 0xcc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, ++ 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x2c10, ++ 0x080c, 0x2068, 0x080c, 0x8bdb, 0x0005, 0x00d6, 0x00f6, 0x2c78, ++ 0x080c, 0x56c3, 0x00fe, 0x0120, 0x2001, 0xc8ff, 0x2004, 0x603e, ++ 0x6003, 0x0002, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, 0x2168, ++ 0x694c, 0xd1e4, 0x0904, 0xa48f, 0xd1cc, 0x0540, 0x6948, 0x6838, ++ 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0xad90, ++ 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304, ++ 0x2012, 0x8318, 0x8210, 0x1f04, 0xa457, 0x015e, 0x000e, 0x6852, ++ 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1629, 0x0418, 0x0016, ++ 0x080c, 0x1629, 0x00de, 0x080c, 0xa934, 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, 0x580a, 0x080c, 0xaf3a, 0x1110, 0x080c, 0x95e3, 0x00de, ++ 0x0005, 0x2019, 0x0001, 0x080c, 0x8e79, 0x6003, 0x0002, 0x2001, ++ 0xc8ff, 0x2004, 0x603e, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x0005, ++ 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, 0x6110, 0x2168, 0x080c, ++ 0xac91, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, 0x95e3, 0x080c, ++ 0x7f6e, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, 0x0007, ++ 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x0005, ++ 0xa182, 0x0040, 0x0002, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, ++ 0xa4e0, 0xa4de, 0xa59b, 0xa5a7, 0xa4de, 0xa4de, 0xa4de, 0xa4de, ++ 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0x080c, 0x1519, ++ 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xcc8c, 0x6110, 0x2178, ++ 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, ++ 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4, 0x0120, 0x080c, ++ 0xaf6c, 0x0804, 0xa596, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, ++ 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, ++ 0xa58c, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, ++ 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0xa58a, 0xa686, 0x0100, ++ 0x1140, 0x2001, 0xcc99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x7e46, ++ 0x0c28, 0x080c, 0x1602, 0x090c, 0x1519, 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, 0xcc98, ++ 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, 0x01d8, 0x7124, ++ 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xcc98, ++ 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa944, 0x0050, ++ 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, ++ 0x080c, 0xa8e9, 0xd6dc, 0x1110, 0xa006, 0x0030, 0x2001, 0x0001, ++ 0x2071, 0xcc8c, 0x7218, 0x731c, 0x080c, 0x18b8, 0x00de, 0x00ee, ++ 0x00fe, 0x007e, 0x0005, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x20e1, ++ 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x2001, ++ 0xc8ff, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002, 0x6110, 0x2168, ++ 0x694c, 0xd1e4, 0x0904, 0xa6b2, 0x603f, 0x0000, 0x00f6, 0x2c78, ++ 0x080c, 0x56c3, 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, 0xaf6c, 0x0804, 0xa6b2, ++ 0x694c, 0xd1cc, 0x0904, 0xa682, 0x6948, 0x6838, 0xd0fc, 0x0904, ++ 0xa645, 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, 0xb0f6, 0x0118, 0x7944, ++ 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, ++ 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, ++ 0x0110, 0x080c, 0xa4ba, 0x6848, 0x784a, 0x6860, 0x7862, 0x685c, ++ 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009, 0x0020, 0x0156, ++ 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa631, 0x015e, ++ 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c, 0xb16e, 0x001e, ++ 0x2168, 0x080c, 0x1629, 0x0804, 0xa6ad, 0x0016, 0x00f6, 0x2178, ++ 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028, ++ 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158, ++ 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x7944, ++ 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, ++ 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, ++ 0x0110, 0x080c, 0xa4ba, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, ++ 0x784e, 0x00fe, 0x080c, 0x1629, 0x00de, 0x080c, 0xb16e, 0x080c, ++ 0xa934, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, ++ 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, 0x00d8, ++ 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x6944, ++ 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0058, ++ 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, ++ 0x0110, 0x080c, 0xa4ba, 0x080c, 0x580a, 0x080c, 0xaf3a, 0x1110, ++ 0x080c, 0x95e3, 0x00de, 0x0005, 0x080c, 0x7db1, 0x0010, 0x080c, ++ 0x7e47, 0x080c, 0xac91, 0x01c0, 0x00d6, 0x6110, 0x2168, 0x6837, ++ 0x0103, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x11c0, 0xd184, 0x1198, ++ 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xc4d7, 0x6847, ++ 0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, ++ 0x080c, 0x7f6e, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, 0x0004, ++ 0x0c70, 0xa182, 0x0040, 0x0002, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, ++ 0xa6f7, 0xa6f9, 0xa6f7, 0xa6fc, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, ++ 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0x080c, ++ 0x1519, 0x080c, 0x95e3, 0x0005, 0x0006, 0x0026, 0xa016, 0x080c, ++ 0x1870, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085, 0x0002, 0xa710, ++ 0xa70e, 0xa70e, 0xa71c, 0xa70e, 0xa70e, 0xa70e, 0x080c, 0x1519, ++ 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, ++ 0x2071, 0xcc80, 0x7224, 0x6212, 0x7220, 0x080c, 0xac81, 0x01a0, ++ 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018, 0x6d18, 0xa52e, ++ 0x1158, 0x00c6, 0x2d60, 0x080c, 0xa954, 0x00ce, 0x0128, 0x6803, ++ 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, ++ 0x080c, 0x7999, 0x080c, 0x7e94, 0x00f6, 0x2278, 0x080c, 0x56c3, ++ 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6, 0x2260, 0x603f, ++ 0x0000, 0x080c, 0xaf6c, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, ++ 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085, 0x0a0c, ++ 0x1519, 0xa08a, 0x008c, 0x1a0c, 0x1519, 0xa082, 0x0085, 0x0072, ++ 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x080c, ++ 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa77d, 0xa77f, ++ 0xa77f, 0xa77d, 0xa77d, 0xa77d, 0xa77d, 0x080c, 0x1519, 0x080c, ++ 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa186, 0x0013, ++ 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8, 0xa186, 0x0027, ++ 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6010, 0x2068, ++ 0x080c, 0xac91, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, ++ 0x0029, 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x0005, 0x080c, 0x962a, 0x0ce0, 0xa186, 0x0014, ++ 0x1dd0, 0x080c, 0x7db1, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, 0x6850, ++ 0xc0ec, 0x6852, 0x08f0, 0x0002, 0xa7cd, 0xa7cb, 0xa7cb, 0xa7cb, ++ 0xa7cb, 0xa7cb, 0xa7e5, 0x080c, 0x1519, 0x080c, 0x7db1, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, ++ 0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, 0x6016, ++ 0x6003, 0x000c, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, ++ 0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, 0x6016, ++ 0x6003, 0x000e, 0x080c, 0x7e94, 0x0005, 0xa182, 0x008c, 0x1220, ++ 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x962a, 0x0005, 0xa80e, ++ 0xa80e, 0xa80e, 0xa80e, 0xa810, 0xa869, 0xa80e, 0x080c, 0x1519, ++ 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0168, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, ++ 0x1118, 0x00de, 0x0804, 0xa87c, 0x080c, 0xac91, 0x1118, 0x080c, ++ 0xae48, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x1110, 0x080c, ++ 0xae48, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b, 0x0006, ++ 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, ++ 0x684b, 0x0005, 0x080c, 0xaf09, 0x6847, 0x0000, 0x080c, 0x580a, ++ 0x2c68, 0x080c, 0x958d, 0x01c0, 0x6003, 0x0001, 0x6007, 0x001e, ++ 0x600b, 0xffff, 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f, ++ 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0xb05e, 0x6950, 0x6152, ++ 0x601f, 0x0001, 0x080c, 0x7999, 0x2d60, 0x080c, 0x95e3, 0x00de, ++ 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0598, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130, 0xa186, 0x001e, ++ 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, 0xb141, ++ 0x1904, 0xa8c1, 0x080c, 0x958d, 0x01d8, 0x6106, 0x6003, 0x0001, ++ 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e, ++ 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a, ++ 0x6950, 0x6152, 0x080c, 0xb05e, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, 0x01c8, ++ 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec, 0x6852, 0x684b, ++ 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, 0x684b, ++ 0x0005, 0x080c, 0xaf09, 0x6847, 0x0000, 0x080c, 0x580a, 0x080c, ++ 0xae48, 0x00de, 0x080c, 0x95e3, 0x0005, 0x0016, 0x00d6, 0x6010, ++ 0x2068, 0x080c, 0xac91, 0x0140, 0x6837, 0x0103, 0x684b, 0x0028, ++ 0x6847, 0x0000, 0x080c, 0x580a, 0x00de, 0x001e, 0xa186, 0x0013, ++ 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, ++ 0x962a, 0x0030, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, 0xa182, ++ 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x2069, 0xcc98, ++ 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, 0x080c, ++ 0xa944, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110, 0x080c, 0x1629, ++ 0x080c, 0x1602, 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, 0x580a, 0x2f68, 0x0cb8, ++ 0x080c, 0x580a, 0x00fe, 0x0005, 0x0156, 0xa184, 0x0001, 0x0108, ++ 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, ++ 0x1f04, 0xa94b, 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, 0xa98b, 0xa98b, ++ 0xa986, 0xa9ad, 0xa979, 0xa986, 0xa9ad, 0xa986, 0xa979, 0x77f4, ++ 0xa986, 0x080c, 0x1519, 0x0036, 0x2019, 0x0010, 0x080c, 0xbd55, ++ 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, 0x0005, ++ 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6010, 0x2068, ++ 0x080c, 0xac91, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, 0x684b, ++ 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001, 0x0005, 0x080c, ++ 0x592e, 0x080c, 0xaf09, 0x080c, 0x580a, 0x080c, 0x95e3, 0xa085, ++ 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, 0x0010, ++ 0x1a0c, 0x1519, 0x000b, 0x0005, 0xa9c4, 0xa9e5, 0xa9c6, 0xaa04, ++ 0xa9e2, 0xa9c4, 0xa986, 0xa98b, 0xa98b, 0xa986, 0xa986, 0xa986, ++ 0xa986, 0xa986, 0xa986, 0xa986, 0x080c, 0x1519, 0x86ff, 0x11b8, ++ 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010, 0x2068, 0x080c, ++ 0xac91, 0x0110, 0x080c, 0xaf09, 0x00de, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, 0xa085, ++ 0x0001, 0x0005, 0x080c, 0x1953, 0x0c08, 0x00e6, 0x2071, 0xc927, ++ 0x7024, 0xac06, 0x1110, 0x080c, 0x8dee, 0x601c, 0xa084, 0x000f, ++ 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, ++ 0x080c, 0x8fc9, 0x009e, 0x008e, 0x0010, 0x080c, 0x8ced, 0x00ee, ++ 0x1928, 0x080c, 0xa986, 0x0005, 0x0036, 0x00e6, 0x2071, 0xc927, ++ 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c, 0x8e79, 0x00ee, ++ 0x003e, 0x0804, 0xa9c6, 0x080c, 0x90f6, 0x00ee, 0x003e, 0x1904, ++ 0xa9c6, 0x080c, 0xa986, 0x0005, 0x00c6, 0x601c, 0xa084, 0x000f, ++ 0x0013, 0x00ce, 0x0005, 0xaa35, 0xaaa2, 0xabf0, 0xaa40, 0xae54, ++ 0xaa35, 0xbd47, 0xb185, 0xaaa2, 0x77c3, 0xac5b, 0x080c, 0x1519, ++ 0x080c, 0xae8f, 0x1110, 0x080c, 0x9c09, 0x0005, 0x080c, 0x7db1, ++ 0x080c, 0x7e94, 0x080c, 0x95e3, 0x0005, 0x6017, 0x0001, 0x0005, ++ 0x080c, 0xac91, 0x0120, 0x6010, 0xa080, 0x0019, 0x2c02, 0x6000, ++ 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xaa5e, 0xaa60, ++ 0xaa80, 0xaa92, 0xaa9f, 0xaa5e, 0xaa35, 0xaa35, 0xaa35, 0xaa92, ++ 0xaa92, 0xaa5e, 0xaa5e, 0xaa5e, 0xaa5e, 0xaa9c, 0x080c, 0x1519, ++ 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0xc927, ++ 0x7024, 0xac06, 0x0190, 0x080c, 0x8ced, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, ++ 0x7999, 0x080c, 0x7e94, 0x00ee, 0x0005, 0x6017, 0x0001, 0x0cd8, ++ 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850, ++ 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x95e3, 0x0005, 0x080c, ++ 0x1953, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, ++ 0x0005, 0xaab9, 0xaa3d, 0xaabb, 0xaab9, 0xaabb, 0xaabb, 0xaa36, ++ 0xaab9, 0xaa30, 0xaa30, 0xaab9, 0xaab9, 0xaab9, 0xaab9, 0xaab9, ++ 0xaab9, 0x080c, 0x1519, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, ++ 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1519, 0x000b, 0x0005, ++ 0xaad4, 0xab96, 0xaad6, 0xab14, 0xaad6, 0xab14, 0xaad6, 0xaae4, ++ 0xaad4, 0xab14, 0xaad4, 0xab00, 0x080c, 0x1519, 0x6004, 0xa08e, ++ 0x0016, 0x05a8, 0xa08e, 0x0004, 0x0590, 0xa08e, 0x0002, 0x0578, ++ 0xa08e, 0x004b, 0x0904, 0xab92, 0x6004, 0x080c, 0xae8f, 0x0904, ++ 0xabaf, 0xa08e, 0x0021, 0x0904, 0xabb3, 0xa08e, 0x0022, 0x0904, ++ 0xabaf, 0xa08e, 0x003d, 0x0904, 0xabb3, 0xa08e, 0x0039, 0x0904, ++ 0xabb7, 0xa08e, 0x0035, 0x0904, 0xabb7, 0xa08e, 0x001e, 0x0188, ++ 0xa08e, 0x0001, 0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, ++ 0x00ff, 0x00de, 0xa086, 0x0006, 0x0110, 0x080c, 0x2e46, 0x080c, ++ 0x9c09, 0x080c, 0xae54, 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, ++ 0x0016, 0x0904, 0xab83, 0xa186, 0x0002, 0x15d8, 0x2001, 0xc635, ++ 0x2004, 0xd08c, 0x1198, 0x080c, 0x5f22, 0x1180, 0x2001, 0xc8e6, ++ 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, ++ 0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0804, 0xabd9, 0x6018, 0x2068, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1904, 0xabd9, 0x68a0, 0xd0bc, ++ 0x1904, 0xabd9, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001, ++ 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, ++ 0x0000, 0x080c, 0x958d, 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001, ++ 0x0450, 0x00de, 0x00ce, 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018, ++ 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1170, 0x2009, 0xc635, ++ 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0xc600, 0x080c, 0x4f02, ++ 0x00ee, 0x080c, 0x9c09, 0x0020, 0x080c, 0x9c09, 0x080c, 0x2e46, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x012e, 0x00ee, ++ 0x080c, 0xae54, 0x0005, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, ++ 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00de, ++ 0x00ce, 0x0c80, 0x080c, 0x2e6c, 0x0804, 0xab0f, 0x00c6, 0x00d6, ++ 0x6104, 0xa186, 0x0016, 0x0d38, 0x6018, 0x2068, 0x6840, 0xa084, ++ 0x00ff, 0xa005, 0x0904, 0xab59, 0x8001, 0x6842, 0x6003, 0x0001, ++ 0x080c, 0x79df, 0x080c, 0x7e94, 0x00de, 0x00ce, 0x0898, 0x080c, ++ 0x9c09, 0x0804, 0xab11, 0x080c, 0x9c37, 0x0804, 0xab11, 0x00d6, ++ 0x2c68, 0x6104, 0x080c, 0xb141, 0x00de, 0x0118, 0x080c, 0x95e3, ++ 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, ++ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, 0x600a, ++ 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x0005, 0x00de, 0x00ce, 0x080c, 0x9c09, 0x080c, 0x2e46, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x6013, 0x0000, 0x601f, ++ 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e, 0x00ee, 0x0005, ++ 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xac07, ++ 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, ++ 0xaa35, 0xac07, 0xaa3d, 0xac09, 0xaa3d, 0xac16, 0xac07, 0x080c, ++ 0x1519, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, ++ 0x000d, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0005, 0x080c, 0xae48, ++ 0x080c, 0xac91, 0x0580, 0x080c, 0x2e46, 0x00d6, 0x080c, 0xac91, ++ 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, ++ 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x580a, 0x2c68, 0x080c, ++ 0x958d, 0x0150, 0x6818, 0x601a, 0x080c, 0xb05e, 0x00c6, 0x2d60, ++ 0x080c, 0xae54, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, 0x0000, ++ 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, ++ 0x080c, 0x7e94, 0x0078, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, ++ 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c, 0x2e46, 0x08b0, ++ 0x080c, 0xae54, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, ++ 0x000b, 0x0005, 0xac72, 0xac72, 0xac72, 0xac74, 0xac74, 0xac72, ++ 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, ++ 0xac72, 0xac72, 0x080c, 0x1519, 0x080c, 0x90f6, 0x190c, 0x1519, ++ 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, 0x95e3, ++ 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xce00, 0x0240, 0x2001, ++ 0xc617, 0x2004, 0xa202, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, ++ 0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, 0x002e, 0x0005, 0x00e6, ++ 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0xce00, ++ 0x2071, 0xc600, 0x7348, 0x7068, 0xa302, 0x12a8, 0x601c, 0xa206, ++ 0x1160, 0x080c, 0xafe9, 0x0148, 0x080c, 0xae8f, 0x1110, 0x080c, ++ 0x9c09, 0x00c6, 0x080c, 0x95e3, 0x00ce, 0xace0, 0x0018, 0x705c, ++ 0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, ++ 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0xc77b, 0x210c, 0x81ff, ++ 0x0128, 0x2061, 0xca3c, 0x611a, 0x080c, 0x2e46, 0xa006, 0x0010, ++ 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0056, ++ 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x005e, 0x0180, ++ 0x6612, 0x651a, 0x080c, 0xb05e, 0x601f, 0x0003, 0x2009, 0x004b, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, ++ 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x62a0, ++ 0x00c6, 0x080c, 0xaf0d, 0x005e, 0x0550, 0x6013, 0x0000, 0x651a, ++ 0x080c, 0xb05e, 0x601f, 0x0003, 0x0016, 0x00c6, 0x2560, 0x080c, ++ 0x553e, 0x00ce, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, ++ 0x7a0e, 0x2c08, 0x080c, 0xbef7, 0x007e, 0x001e, 0xd184, 0x0128, ++ 0x080c, 0x95e3, 0xa085, 0x0001, 0x0030, 0x2009, 0x004c, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x958d, 0x2c78, ++ 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, ++ 0x0005, 0x080c, 0xad87, 0x2f60, 0x2009, 0x004d, 0x080c, 0x9613, ++ 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, ++ 0x0046, 0x00c6, 0x080c, 0x958d, 0x2c78, 0x00ce, 0x0178, 0x7e12, ++ 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x0481, 0x2f60, ++ 0x2009, 0x004e, 0x080c, 0x9613, 0xa085, 0x0001, 0x004e, 0x00ce, ++ 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x958d, ++ 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, ++ 0x2021, 0x0004, 0x00a1, 0x2001, 0xc8e7, 0x2004, 0xd0fc, 0x0120, ++ 0x2f60, 0x080c, 0x95e3, 0x0028, 0x2f60, 0x2009, 0x0052, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x0096, ++ 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x54e0, 0x0118, 0x2001, ++ 0xad8c, 0x0028, 0x080c, 0x54b0, 0x0158, 0x2001, 0xad92, 0x0006, ++ 0xa00e, 0x2400, 0x080c, 0x592e, 0x080c, 0x580a, 0x000e, 0x0807, ++ 0x2418, 0x080c, 0x7d50, 0x62a0, 0x0086, 0x2041, 0x0001, 0x2039, ++ 0x0001, 0x2608, 0x080c, 0x7b2f, 0x008e, 0x080c, 0x7a0e, 0x2f08, ++ 0x2648, 0x080c, 0xbef7, 0x613c, 0x81ff, 0x090c, 0x7be4, 0x080c, ++ 0x7e94, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, ++ 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0008, ++ 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x9613, 0xa085, 0x0001, ++ 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0xaf0d, ++ 0x001e, 0x0180, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, ++ 0x6012, 0x2009, 0x0000, 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, ++ 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, ++ 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, ++ 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0044, 0x080c, ++ 0x9613, 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, 0xc8fd, 0x2004, ++ 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004, 0x6016, 0x080c, ++ 0xc3e2, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, 0x00c6, 0x00d6, ++ 0x2031, 0xc653, 0x2634, 0xd6e4, 0x0128, 0x6618, 0x2660, 0x6e48, ++ 0x080c, 0x5469, 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, ++ 0x958d, 0x001e, 0x0190, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0001, ++ 0x2d00, 0x6012, 0x080c, 0x2e46, 0x2009, 0x0028, 0x080c, 0x9613, ++ 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0xa186, ++ 0x0015, 0x1178, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, 0x1148, ++ 0x080c, 0x9fb9, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x79df, ++ 0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x0005, 0xa186, 0x0016, ++ 0x1128, 0x2001, 0x0004, 0x080c, 0x5291, 0x00e8, 0xa186, 0x0015, ++ 0x11e8, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014, 0x11b8, 0x00d6, ++ 0x6018, 0x2068, 0x080c, 0x53df, 0x00de, 0x080c, 0xa072, 0x1170, ++ 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0138, 0x2001, ++ 0x0006, 0x080c, 0x5291, 0x080c, 0x9767, 0x0020, 0x080c, 0x9c09, ++ 0x080c, 0x95e3, 0x0005, 0x6848, 0xa086, 0x0005, 0x1108, 0x0009, ++ 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6, 0x0126, 0x2071, ++ 0xc600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001, 0x0608, 0x704c, ++ 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, ++ 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, 0x6003, 0x0008, ++ 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, 0x754e, ++ 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xce00, 0x0cc0, ++ 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xcc8c, 0x7014, 0xd0e4, 0x0150, ++ 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x7999, ++ 0x080c, 0x7e94, 0x00ee, 0x0005, 0x00c6, 0x00f6, 0x2c78, 0x080c, ++ 0x56c3, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce, ++ 0x0005, 0xaa35, 0xaf64, 0xaf67, 0xaf6a, 0xc1cf, 0xc1ea, 0xc1ed, ++ 0xaa35, 0xaa35, 0x080c, 0x1519, 0xe000, 0xe000, 0x0005, 0xe000, ++ 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, ++ 0x0538, 0x080c, 0x958d, 0x1128, 0x2001, 0xc8ff, 0x2004, 0x783e, ++ 0x00f8, 0x7818, 0x601a, 0x080c, 0xb05e, 0x781c, 0xa086, 0x0003, ++ 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020, 0x7808, 0x603a, ++ 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, ++ 0x0001, 0x7950, 0x6152, 0x080c, 0x7999, 0x080c, 0x7e94, 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, 0x7999, 0x6803, 0x0002, 0x00fe, 0x001e, ++ 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x1118, 0xa085, 0x0001, ++ 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022, 0x6010, 0x2078, ++ 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x1953, 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, 0xc8f9, ++ 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x783f, 0x2001, ++ 0xc8fd, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0xc8fb, ++ 0x200c, 0x8000, 0x2014, 0x2071, 0xc8d5, 0x711a, 0x721e, 0x2001, ++ 0x0064, 0x080c, 0x783f, 0x2001, 0xc8fe, 0x82ff, 0x1110, 0x2011, ++ 0x0014, 0x2202, 0x2009, 0xc8ff, 0xa280, 0x000a, 0x200a, 0x080c, ++ 0x572c, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, ++ 0x00e6, 0x2001, 0xc8fd, 0x2003, 0x0028, 0x2001, 0xc8fe, 0x2003, ++ 0x0014, 0x2071, 0xc8d5, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, ++ 0xc8ff, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005, 0x00d6, 0x6054, ++ 0xa06d, 0x0110, 0x080c, 0x1619, 0x00de, 0x0005, 0x0005, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0178, ++ 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xc600, 0xa186, 0x0015, ++ 0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, 0x6010, 0x2068, 0x6a3c, ++ 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x80af, 0x01d8, 0x7070, 0x6a50, ++ 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140, 0x6218, 0xa290, ++ 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x080c, 0x9767, ++ 0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x00fe, 0x00ee, 0x00de, ++ 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80, 0x00c6, 0x0126, ++ 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0180, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0043, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xc600, 0xa186, 0x0015, ++ 0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, 0x6010, 0xa0e8, 0x000f, ++ 0x2c78, 0x080c, 0x80af, 0x01a8, 0x7070, 0x6a08, 0xa206, 0x1130, ++ 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2e46, 0x080c, 0x9767, ++ 0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 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, 0x55de, ++ 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, 0x580a, 0x6013, 0x0000, 0x003e, 0x00de, ++ 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035, 0x0110, 0x6a34, ++ 0x0008, 0x6a28, 0x080c, 0xac81, 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, 0xa4ba, 0x0005, 0x080c, 0x95e3, 0x0804, ++ 0x7e94, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, ++ 0x006e, 0x0005, 0xb1a2, 0xb6b9, 0xb7e1, 0xb1a2, 0xb1a2, 0xb1a2, ++ 0xb1a2, 0xb1a2, 0xb1da, 0xb865, 0xb1a2, 0xb1a2, 0xb1a2, 0xb1a2, ++ 0xb1a2, 0xb1a2, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, ++ 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0xb1bd, 0xbcec, 0xb1bd, ++ 0xb1bd, 0xb1bd, 0xb1bd, 0xb1bd, 0xb1bd, 0xbcae, 0xbd34, 0xb1bd, ++ 0xc314, 0xc344, 0xc314, 0xc344, 0xb1bd, 0x080c, 0x1519, 0x0066, ++ 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, ++ 0xb1d8, 0xb9b5, 0xba82, 0xbaaf, 0xbb33, 0xb1d8, 0xbc20, 0xbbcb, ++ 0xb871, 0xbc84, 0xbc99, 0xb1d8, 0xb1d8, 0xb1d8, 0xb1d8, 0xb1d8, ++ 0x080c, 0x1519, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0x2100, 0xa1b2, ++ 0x0040, 0x1a04, 0xb5f1, 0x0002, 0xb224, 0xb3ef, 0xb224, 0xb224, ++ 0xb224, 0xb3f6, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, ++ 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, ++ 0xb224, 0xb224, 0xb224, 0xb226, 0xb284, 0xb293, 0xb2e1, 0xb2ff, ++ 0xb37d, 0xb3dc, 0xb224, 0xb224, 0xb3f9, 0xb224, 0xb224, 0xb40c, ++ 0xb417, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb4a2, 0xb224, ++ 0xb224, 0xb4b5, 0xb224, 0xb224, 0xb46d, 0xb224, 0xb224, 0xb224, ++ 0xb4cd, 0xb224, 0xb224, 0xb224, 0xb547, 0xb224, 0xb224, 0xb224, ++ 0xb224, 0xb224, 0xb224, 0xb5b8, 0x080c, 0x1519, 0x080c, 0x570b, ++ 0x1150, 0x2001, 0xc635, 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, ++ 0xa086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, ++ 0x0000, 0x0804, 0xb3ea, 0x080c, 0x568d, 0x00e6, 0x00c6, 0x0036, ++ 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, ++ 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x2c08, ++ 0x080c, 0xbef7, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e, 0x001e, ++ 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, ++ 0x534c, 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, ++ 0x0006, 0x0278, 0x080c, 0xbe3b, 0x1904, 0xb2db, 0x080c, 0xbddb, ++ 0x1120, 0x6007, 0x0008, 0x0804, 0xb3ea, 0x6007, 0x0009, 0x0804, ++ 0xb3ea, 0x080c, 0xc023, 0x0128, 0x080c, 0xbe3b, 0x0d78, 0x0804, ++ 0xb2db, 0x6013, 0x1900, 0x0c88, 0x080c, 0x2f69, 0x1904, 0xb5ee, ++ 0x6106, 0x080c, 0xbd95, 0x6007, 0x0006, 0x0804, 0xb3ea, 0x6007, ++ 0x0007, 0x0804, 0xb3ea, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, ++ 0x2f69, 0x1904, 0xb5ee, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684, ++ 0x00ff, 0xa082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x527f, ++ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, ++ 0x0170, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, ++ 0x0004, 0x0128, 0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, ++ 0xbe99, 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, ++ 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x002e, 0x080c, ++ 0x53df, 0x6007, 0x000a, 0x00de, 0x0804, 0xb3ea, 0x6007, 0x000b, ++ 0x00de, 0x0804, 0xb3ea, 0x080c, 0x2e46, 0x6007, 0x0001, 0x0804, ++ 0xb3ea, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, ++ 0xb5ee, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, ++ 0x0d50, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, ++ 0x080c, 0x2e8b, 0x002e, 0x6007, 0x000c, 0x0804, 0xb3ea, 0x080c, ++ 0x570b, 0x1140, 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, ++ 0x0008, 0x1110, 0x0804, 0xb233, 0x080c, 0x568d, 0x6618, 0xa6b0, ++ 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138, ++ 0x0026, 0x2001, 0x0006, 0x080c, 0x52be, 0x002e, 0x0050, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, ++ 0xb2db, 0x080c, 0xbea6, 0x1120, 0x6007, 0x000e, 0x0804, 0xb3ea, ++ 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, ++ 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, 0xc653, ++ 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc190, 0x6018, ++ 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, ++ 0x6007, 0x0001, 0x0804, 0xb3ea, 0x2001, 0x0001, 0x080c, 0x527f, ++ 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, ++ 0x2011, 0xcc90, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, 0x015e, ++ 0xa005, 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, ++ 0xb2db, 0xa682, 0x0007, 0x0a04, 0xb329, 0x0804, 0xb2db, 0x6013, ++ 0x1900, 0x6007, 0x0009, 0x0804, 0xb3ea, 0x080c, 0x570b, 0x1140, ++ 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, ++ 0x0804, 0xb233, 0x080c, 0x568d, 0x6618, 0xa6b0, 0x0001, 0x2634, ++ 0xa684, 0x00ff, 0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, ++ 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xb2db, 0x080c, ++ 0xbece, 0x1138, 0x080c, 0xbddb, 0x1120, 0x6007, 0x0010, 0x0804, ++ 0xb3ea, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, ++ 0x8427, 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, ++ 0xc653, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc190, ++ 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, ++ 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc023, 0x0140, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0006, 0x0950, 0x0804, 0xb2db, 0x6013, ++ 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f69, 0x1904, 0xb5ee, ++ 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0xb652, 0x1904, 0xb2db, ++ 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x6007, ++ 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, 0x0cc0, 0x6007, 0x0005, ++ 0x0cc0, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, ++ 0xb5ee, 0x080c, 0xb652, 0x1904, 0xb2db, 0x6007, 0x0020, 0x6003, ++ 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, ++ 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, ++ 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, ++ 0xb652, 0x1904, 0xb2db, 0x0016, 0x0026, 0x2011, 0xcc91, 0x2214, ++ 0xa286, 0xffff, 0x0190, 0x2c08, 0x080c, 0xac81, 0x01e0, 0x2260, ++ 0x2011, 0xcc90, 0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, ++ 0x0006, 0x2214, 0xa206, 0x01e8, 0x0070, 0x2011, 0xcc90, 0x2214, ++ 0x2c08, 0xa006, 0x080c, 0xc162, 0x11a0, 0x2011, 0xcc91, 0x2214, ++ 0xa286, 0xffff, 0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, ++ 0x2011, 0xcc89, 0x2214, 0xa296, 0xffff, 0x1180, 0x6007, 0x0025, ++ 0x0068, 0x601c, 0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024, ++ 0x1110, 0x080c, 0x95e3, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, ++ 0x080c, 0x79df, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, ++ 0x527f, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, ++ 0xc605, 0x2011, 0xcc96, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, ++ 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xb3ea, 0x080c, 0x9df5, ++ 0x080c, 0x5f22, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x5f3e, ++ 0x1158, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, ++ 0x0001, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x5ef9, 0x003e, 0x002e, ++ 0x000e, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, 0xb652, ++ 0x1904, 0xb2db, 0x6106, 0x080c, 0xb66e, 0x6007, 0x002b, 0x0804, ++ 0xb3ea, 0x6007, 0x002c, 0x0804, 0xb3ea, 0x080c, 0xc378, 0x1904, ++ 0xb5ee, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, 0xb652, 0x1904, ++ 0xb2db, 0x6106, 0x080c, 0xb672, 0x1120, 0x6007, 0x002e, 0x0804, ++ 0xb3ea, 0x6007, 0x002f, 0x0804, 0xb3ea, 0x080c, 0x2f69, 0x1904, ++ 0xb5ee, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c, ++ 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, 0x8007, ++ 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xb3ef, ++ 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb544, 0x2071, 0xcc8c, ++ 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xc653, ++ 0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810, 0xa106, 0x1118, ++ 0x6814, 0xa206, 0x01f8, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x1590, ++ 0x2069, 0xc600, 0x6874, 0xa206, 0x1568, 0x6870, 0xa106, 0x1550, ++ 0x7210, 0x080c, 0xac81, 0x0558, 0x080c, 0xc1fc, 0x0540, 0x622a, ++ 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x7999, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, 0xac81, ++ 0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1180, 0x0c08, ++ 0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xc162, 0x2c10, 0x2160, ++ 0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500, 0x08d8, 0x6007, ++ 0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012, 0x0898, 0x080c, ++ 0x2f69, 0x1904, 0xb5ee, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, ++ 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xb3ef, 0x00e6, 0x00d6, ++ 0x00c6, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb5b0, 0x2069, ++ 0xc600, 0x2071, 0xcc8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, ++ 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085, 0x0001, 0x080c, ++ 0xc162, 0x2c10, 0x00ce, 0x0588, 0x080c, 0xac81, 0x0570, 0x00c6, ++ 0x0026, 0x2260, 0x080c, 0xa954, 0x002e, 0x00ce, 0x7118, 0xa18c, ++ 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, 0x0118, ++ 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, 0x0150, ++ 0x0056, 0x7510, 0x7614, 0x080c, 0xc213, 0x005e, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, ++ 0x6003, 0x0001, 0x080c, 0x7999, 0x0c88, 0x6007, 0x003b, 0x602b, ++ 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x7999, 0x0c30, ++ 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, 0xb51a, ++ 0x00e6, 0x0026, 0x080c, 0x570b, 0x0558, 0x080c, 0x568d, 0x080c, ++ 0xc3f3, 0x1520, 0x2071, 0xc600, 0x70d4, 0xc085, 0x70d6, 0x00f6, ++ 0x2079, 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072, 0x78e6, 0xa284, ++ 0xff00, 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe, 0x70df, 0x0000, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0120, 0x2011, 0xc940, 0x2013, ++ 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2c62, 0x0010, 0x080c, 0xc41f, ++ 0x002e, 0x00ee, 0x080c, 0x95e3, 0x0804, 0xb3ee, 0x080c, 0x95e3, ++ 0x0005, 0x2600, 0x0002, 0xb5fc, 0xb630, 0xb641, 0xb5fc, 0xb5fc, ++ 0xb5fe, 0xb617, 0xb5fc, 0xb5fc, 0x080c, 0x1519, 0x080c, 0xc378, ++ 0x1d68, 0x080c, 0x2f69, 0x1d50, 0x080c, 0xb652, 0x1138, 0x6007, ++ 0x0045, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0x2e46, ++ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, ++ 0x2f69, 0x19a0, 0x080c, 0x768f, 0x1160, 0x2e00, 0xa080, 0x0010, ++ 0x2004, 0x8007, 0xd084, 0x0110, 0x080c, 0xc428, 0x080c, 0x95e3, ++ 0x0005, 0x2009, 0x0046, 0x080c, 0xc44e, 0x080c, 0x95e3, 0x0005, ++ 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x2009, 0x0041, 0x080c, 0xc44e, ++ 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, ++ 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x2009, 0x0042, 0x080c, ++ 0xc44e, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, ++ 0x7e94, 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, 0x29c7, 0x1130, 0x2110, 0x2009, 0x0000, ++ 0x080c, 0x2e8b, 0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, ++ 0x0005, 0x2069, 0xcc8d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, ++ 0x0000, 0xa085, 0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, ++ 0x2069, 0xcc8c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x1140, ++ 0x6800, 0xa084, 0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010, ++ 0x0005, 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013, ++ 0x1130, 0x2008, 0xa1b2, 0x0040, 0x1a04, 0xb7bb, 0x0092, 0xa1b6, ++ 0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, 0x1519, 0x2001, 0x0007, ++ 0x080c, 0x52be, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0xb719, 0xb71b, 0xb719, 0xb719, 0xb719, 0xb71b, 0xb72d, ++ 0xb7b4, 0xb77d, 0xb7b4, 0xb790, 0xb7b4, 0xb72d, 0xb7b4, 0xb7ac, ++ 0xb7b4, 0xb7ac, 0xb7b4, 0xb7b4, 0xb719, 0xb719, 0xb719, 0xb719, ++ 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb71b, ++ 0xb719, 0xb7b4, 0xb719, 0xb719, 0xb7b4, 0xb719, 0xb7b1, 0xb7b4, ++ 0xb719, 0xb719, 0xb719, 0xb719, 0xb7b4, 0xb7b4, 0xb719, 0xb7b4, ++ 0xb7b4, 0xb719, 0xb727, 0xb719, 0xb719, 0xb719, 0xb719, 0xb7b0, ++ 0xb7b4, 0xb719, 0xb719, 0xb7b4, 0xb7b4, 0xb719, 0xb719, 0xb719, ++ 0xb719, 0x080c, 0x1519, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, ++ 0x6016, 0x6003, 0x0002, 0x080c, 0x7e94, 0x0804, 0xb7ba, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x0804, 0xb7b4, 0x00f6, 0x2079, 0xc652, ++ 0x7804, 0x00fe, 0xd0ac, 0x1904, 0xb7b4, 0x2001, 0x0000, 0x080c, ++ 0x527f, 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x1140, ++ 0x00f6, 0x2079, 0xc600, 0x7898, 0x8000, 0x789a, 0x00fe, 0x00e0, ++ 0x00c6, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x1140, 0x6010, 0xa005, ++ 0x0128, 0x00ce, 0x080c, 0x40ef, 0x0804, 0xb7b4, 0x00ce, 0x2001, ++ 0xc600, 0x2004, 0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, 0xc600, ++ 0x7898, 0x8000, 0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5291, ++ 0x080c, 0x7db1, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x79df, 0x080c, 0x7e94, 0x00c6, 0x6118, 0x2160, 0x2009, ++ 0x0001, 0x080c, 0x6fb9, 0x00ce, 0x04e8, 0x6618, 0x00d6, 0x2668, ++ 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0560, ++ 0xa686, 0x0004, 0x0548, 0x080c, 0x7669, 0x2001, 0x0004, 0x0410, ++ 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, 0x40ef, ++ 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, 0x52be, 0x080c, 0x7db1, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x0005, 0x2600, 0x0002, 0xb7c6, 0xb7c6, 0xb7c6, ++ 0xb7c6, 0xb7c6, 0xb7c8, 0xb7c6, 0xb7c8, 0xb7c6, 0x080c, 0x1519, ++ 0x080c, 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0x0016, ++ 0x00d6, 0x6118, 0x2168, 0x6900, 0xd184, 0x0140, 0x080c, 0x5291, ++ 0x2001, 0x0000, 0x080c, 0x527f, 0x080c, 0x2e6c, 0x00de, 0x001e, ++ 0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00, 0x8007, ++ 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1519, 0xa1b6, 0x0015, 0x1110, ++ 0x003b, 0x0028, 0xa1b6, 0x0016, 0x190c, 0x1519, 0x006b, 0x0005, ++ 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0xb851, 0xb810, ++ 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, ++ 0x9cda, 0x9cda, 0xb851, 0xb858, 0x9cda, 0x9cda, 0x9cda, 0x9cda, ++ 0x00f6, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x11e0, 0x6018, 0xa07d, ++ 0x01c8, 0x7800, 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x601f, ++ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c, ++ 0x7e94, 0x00e8, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, ++ 0x29c7, 0x11a8, 0x00c6, 0x080c, 0x533d, 0x0120, 0x00ce, 0x080c, ++ 0x95e3, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006, 0x080c, 0x4f47, ++ 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c, 0x95e3, 0x00fe, ++ 0x0005, 0x6604, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x95e3, 0x0005, ++ 0x080c, 0x9fb6, 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x79df, 0x0010, 0x080c, 0x95e3, 0x0005, 0x6004, 0xa08a, 0x0080, ++ 0x1a0c, 0x1519, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0xa182, 0x0040, 0x0002, 0xb887, 0xb887, 0xb887, 0xb887, ++ 0xb889, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, ++ 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0x080c, ++ 0x1519, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, 0x6218, ++ 0xa280, 0x002f, 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, 0x080c, ++ 0xc3c4, 0x6106, 0x2071, 0xcc80, 0x7444, 0xa4a4, 0xff00, 0x0904, ++ 0xb8ed, 0xa486, 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, 0x0200, ++ 0x080c, 0x712e, 0x080c, 0x1602, 0x090c, 0x1519, 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, 0x580a, 0x001e, 0xa486, ++ 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xc10d, 0x0804, 0xb94a, ++ 0xa486, 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0xc0bf, 0x0804, ++ 0xb94a, 0xa486, 0x0200, 0x1110, 0x080c, 0xc0a4, 0xa486, 0x1000, ++ 0x1110, 0x080c, 0xc0f2, 0x0804, 0xb94a, 0x2069, 0xc9bc, 0x6a00, ++ 0xd284, 0x0904, 0xb9b1, 0xa284, 0x0300, 0x1904, 0xb9aa, 0x6804, ++ 0xa005, 0x0904, 0xb992, 0x2d78, 0x6003, 0x0007, 0x080c, 0x15e5, ++ 0x0904, 0xb951, 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, 0xcc90, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000, ++ 0x8210, 0x1f04, 0xb93c, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, ++ 0x080c, 0x580a, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, 0x00de, ++ 0x0005, 0x2001, 0xc60e, 0x2004, 0xd084, 0x0120, 0x080c, 0x1602, ++ 0x1904, 0xb902, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, ++ 0x080c, 0x7999, 0x080c, 0x7e94, 0x0c28, 0x2069, 0xcc92, 0x2d04, ++ 0xa084, 0xff00, 0xa086, 0x1200, 0x11a8, 0x2069, 0xcc80, 0x686c, ++ 0xa084, 0x00ff, 0x0016, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, ++ 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x0840, 0x6868, 0x602a, 0x686c, 0x602e, 0x6013, 0x0200, ++ 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x0804, 0xb94a, 0x2001, 0xc60d, 0x2004, 0xd0ec, 0x0120, 0x2011, ++ 0x8049, 0x080c, 0x407d, 0x6013, 0x0300, 0x0010, 0x6013, 0x0100, ++ 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x0804, 0xb94a, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804, ++ 0xb965, 0x6013, 0x0200, 0x0804, 0xb965, 0xa186, 0x0013, 0x1170, ++ 0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c, ++ 0x1519, 0xa082, 0x0040, 0x2008, 0x0804, 0xba3f, 0xa186, 0x0051, ++ 0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, 0x0518, ++ 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2800, ++ 0x0006, 0x0016, 0x0026, 0x080c, 0x7873, 0x002e, 0x001e, 0x000e, ++ 0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xba82, 0xa186, ++ 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x6004, 0xa082, ++ 0x0040, 0x2008, 0x001a, 0x080c, 0x962a, 0x0005, 0xba09, 0xba0b, ++ 0xba0b, 0xba2f, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, ++ 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, ++ 0xba09, 0x080c, 0x1519, 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0036, ++ 0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003, ++ 0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, ++ 0xc141, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, 0xc8fe, ++ 0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6, ++ 0x080c, 0x7db1, 0x080c, 0x7e94, 0x080c, 0xac91, 0x0120, 0x6010, ++ 0x2068, 0x080c, 0x1619, 0x080c, 0xae54, 0x00de, 0x0005, 0x0002, ++ 0xba53, 0xba70, 0xba5c, 0xba7c, 0xba53, 0xba53, 0xba53, 0xba53, ++ 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, ++ 0xba53, 0xba53, 0xba53, 0x080c, 0x1519, 0x6010, 0xa088, 0x0013, ++ 0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7db1, 0x6010, 0xa080, ++ 0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, ++ 0x080c, 0x9613, 0x0010, 0x6003, 0x0002, 0x080c, 0x7e94, 0x0005, ++ 0x080c, 0x7db1, 0x080c, 0xc37f, 0x1120, 0x080c, 0x7103, 0x080c, ++ 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x2009, 0x0041, ++ 0x0804, 0xbbcb, 0xa182, 0x0040, 0x0002, 0xba98, 0xba9a, 0xba98, ++ 0xba98, 0xba98, 0xba98, 0xba98, 0xba9b, 0xba98, 0xba98, 0xba98, ++ 0xba98, 0xba98, 0xba98, 0xba98, 0xba98, 0xba98, 0xbaa6, 0xba98, ++ 0x080c, 0x1519, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, ++ 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x00d6, 0x080c, ++ 0x7103, 0x00de, 0x080c, 0xc3e2, 0x080c, 0x95e3, 0x0005, 0xa182, ++ 0x0040, 0x0002, 0xbac5, 0xbac5, 0xbac5, 0xbac5, 0xbac5, 0xbac5, ++ 0xbac5, 0xbac7, 0xbac5, 0xbaca, 0xbb03, 0xbac5, 0xbac5, 0xbac5, ++ 0xbac5, 0xbb03, 0xbac5, 0xbac5, 0xbac5, 0x080c, 0x1519, 0x080c, ++ 0x962a, 0x0005, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0158, 0x2001, ++ 0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, 0x2004, ++ 0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x7e47, 0x080c, 0x7f6e, ++ 0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003, ++ 0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, 0xbbcb, ++ 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x7103, 0x00de, 0x0005, ++ 0x080c, 0xc37f, 0x0110, 0x00de, 0x0005, 0x080c, 0x7103, 0x080c, ++ 0x95e3, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x7e47, 0x080c, 0x7f6e, ++ 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, 0xc141, 0x6014, 0xa005, 0x1128, 0x2001, ++ 0xc8fe, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007, ++ 0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, 0xa086, ++ 0x0042, 0x190c, 0x1519, 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0005, ++ 0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, 0xa086, ++ 0x0042, 0x190c, 0x1519, 0x2001, 0x0007, 0x080c, 0x52be, 0x080c, ++ 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa182, 0x0040, ++ 0x0002, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, ++ 0xbb6e, 0xbb7a, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, ++ 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0x080c, 0x1519, 0x0036, 0x0046, ++ 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 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, 0x7103, 0x00de, ++ 0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x000e, ++ 0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xc60d, 0x210c, ++ 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x0021, ++ 0x080c, 0x7105, 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, 0x1519, 0x6020, 0xd0dc, ++ 0x090c, 0x1519, 0x0005, 0xbbee, 0xbbf5, 0xbc01, 0xbc0d, 0xbbee, ++ 0xbbee, 0xbbee, 0xbc1c, 0xbbee, 0xbbf0, 0xbbf0, 0xbbee, 0xbbee, ++ 0xbbee, 0xbbee, 0xbbf0, 0xbbee, 0xbbf0, 0xbbee, 0x080c, 0x1519, ++ 0x6020, 0xd0dc, 0x090c, 0x1519, 0x0005, 0x6003, 0x0001, 0x6106, ++ 0x080c, 0x7999, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, ++ 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, ++ 0x2c10, 0x080c, 0x2068, 0x0126, 0x2091, 0x8000, 0x080c, 0x79fc, ++ 0x080c, 0x7f6e, 0x012e, 0x0005, 0xa016, 0x080c, 0x1870, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, 0x0023, ++ 0x00de, 0x003e, 0x012e, 0x0005, 0xbc3c, 0xbc3e, 0xbc50, 0xbc6b, ++ 0xbc3c, 0xbc3c, 0xbc3c, 0xbc80, 0xbc3c, 0xbc3c, 0xbc3c, 0xbc3c, ++ 0xbc3c, 0xbc3c, 0xbc3c, 0xbc3c, 0x080c, 0x1519, 0x6010, 0x2068, ++ 0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x01d0, ++ 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0498, ++ 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, 0xa39e, ++ 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, ++ 0x080c, 0xc141, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0d90, ++ 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, 0x6106, ++ 0x2c10, 0x080c, 0x2068, 0x080c, 0x79fc, 0x080c, 0x7f6e, 0x0018, ++ 0xa016, 0x080c, 0x1870, 0x0005, 0x080c, 0x7db1, 0x6110, 0x81ff, ++ 0x0158, 0x00d6, 0x2168, 0x080c, 0xc4d7, 0x0036, 0x2019, 0x0029, ++ 0x080c, 0xc141, 0x003e, 0x00de, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0x080c, 0x7e47, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168, ++ 0x080c, 0xc4d7, 0x0036, 0x2019, 0x0029, 0x080c, 0xc141, 0x003e, ++ 0x00de, 0x080c, 0xae54, 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0085, ++ 0x0002, 0xbcba, 0xbcb8, 0xbcb8, 0xbcc6, 0xbcb8, 0xbcb8, 0xbcb8, ++ 0x080c, 0x1519, 0x6003, 0x000b, 0x6106, 0x080c, 0x7999, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x00e6, ++ 0x080c, 0xc378, 0x0118, 0x080c, 0x95e3, 0x00d8, 0x2071, 0xcc80, ++ 0x7224, 0x6212, 0x7220, 0x080c, 0xbfef, 0x0118, 0x6007, 0x0086, ++ 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, 0x6007, ++ 0x0086, 0x6003, 0x0001, 0x080c, 0x7999, 0x080c, 0x7e94, 0x080c, ++ 0x7f6e, 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, ++ 0xa08a, 0x0085, 0x0a0c, 0x1519, 0xa08a, 0x008c, 0x1a0c, 0x1519, ++ 0xa082, 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014, ++ 0x0118, 0x080c, 0x962a, 0x0050, 0x2001, 0x0007, 0x080c, 0x52be, ++ 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xbd16, ++ 0xbd18, 0xbd18, 0xbd16, 0xbd16, 0xbd16, 0xbd16, 0x080c, 0x1519, ++ 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa182, ++ 0x0085, 0x0a0c, 0x1519, 0xa182, 0x008c, 0x1a0c, 0x1519, 0xa182, ++ 0x0085, 0x0002, 0xbd31, 0xbd31, 0xbd31, 0xbd33, 0xbd31, 0xbd31, ++ 0xbd31, 0x080c, 0x1519, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186, ++ 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x962a, 0x0030, ++ 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0x0036, ++ 0x080c, 0xc3e2, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f, ++ 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, ++ 0x8000, 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, ++ 0x009e, 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x906f, 0x007e, ++ 0x1548, 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007, ++ 0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xc3e2, ++ 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, 0x1953, ++ 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, 0xc141, 0x00de, ++ 0x6013, 0x0000, 0x080c, 0xc3e2, 0x601f, 0x0007, 0x2001, 0xc8fd, ++ 0x2004, 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036, ++ 0x0156, 0x2079, 0xcc80, 0x7938, 0x783c, 0x080c, 0x29c7, 0x15b0, ++ 0x0016, 0x00c6, 0x080c, 0x533d, 0x1578, 0x001e, 0x002e, 0x0026, ++ 0x0016, 0x2019, 0x0029, 0x080c, 0x9132, 0x080c, 0x7b16, 0x0076, ++ 0x2039, 0x0000, 0x080c, 0x7a0e, 0x007e, 0x001e, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0xbef7, 0x007e, 0x080c, 0x553e, 0x0026, 0x6204, ++ 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004, ++ 0x1118, 0x62a0, 0x080c, 0x2eff, 0x002e, 0x001e, 0x080c, 0x4f47, ++ 0x6612, 0x6516, 0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, ++ 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009, ++ 0xc621, 0x2104, 0xa086, 0x0074, 0x1904, 0xbe30, 0x2069, 0xcc8e, ++ 0x690c, 0xa182, 0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8, ++ 0x2001, 0xc8e5, 0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010, ++ 0xa084, 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800, ++ 0x0560, 0x6910, 0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xccae, ++ 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, 0x534c, ++ 0x00ce, 0x04c0, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9, 0x0004, ++ 0x080c, 0xa103, 0x1580, 0x2011, 0xcc9a, 0xad98, 0x0006, 0x20a9, ++ 0x0004, 0x080c, 0xa103, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294, ++ 0x00ff, 0x8227, 0xa006, 0x2009, 0xc653, 0x210c, 0xd1a4, 0x0138, ++ 0x2009, 0x0029, 0x080c, 0xc190, 0x6800, 0xc0e5, 0x6802, 0x2019, ++ 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, ++ 0x2c08, 0x080c, 0xbef7, 0x007e, 0x2001, 0x0007, 0x080c, 0x52be, ++ 0x001e, 0x004e, 0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce, ++ 0x0005, 0x00d6, 0x2069, 0xcc8e, 0x6800, 0xa086, 0x0800, 0x0118, ++ 0x6013, 0x0000, 0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6, ++ 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0xcc8c, 0x7930, 0x7834, ++ 0x080c, 0x29c7, 0x11a0, 0x080c, 0x533d, 0x1188, 0x2011, 0xcc90, ++ 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, 0x1140, 0x2011, ++ 0xcc94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa103, 0x015e, ++ 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006, ++ 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0xcc83, 0x2204, 0x8211, ++ 0x220c, 0x080c, 0x29c7, 0x11a0, 0x080c, 0x533d, 0x1188, 0x2011, ++ 0xcc96, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, 0x1140, ++ 0x2011, 0xcc9a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa103, ++ 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6, ++ 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, ++ 0x2091, 0x8000, 0x2740, 0x2029, 0xc930, 0x252c, 0x2021, 0xc936, ++ 0x2424, 0x2061, 0xce00, 0x2071, 0xc600, 0x7648, 0x7068, 0x81ff, ++ 0x0150, 0x0006, 0xa186, 0xca3c, 0x000e, 0x0128, 0x8001, 0xa602, ++ 0x1a04, 0xbf78, 0x0018, 0xa606, 0x0904, 0xbf78, 0x2100, 0xac06, ++ 0x0904, 0xbf6f, 0x080c, 0xc1b8, 0x0904, 0xbf6f, 0x671c, 0xa786, ++ 0x0001, 0x0904, 0xbfc1, 0xa786, 0x0004, 0x0904, 0xbfc1, 0xa786, ++ 0x0007, 0x05e8, 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, ++ 0x080c, 0xc1c8, 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, ++ 0x00d6, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953, ++ 0x001e, 0xa786, 0x0008, 0x1148, 0x080c, 0xae8f, 0x1130, 0x080c, ++ 0x9c09, 0x00de, 0x080c, 0xae54, 0x00d0, 0x6010, 0x2068, 0x080c, ++ 0xac91, 0x0190, 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, ++ 0x6847, 0x0000, 0x080c, 0xc4d7, 0x0016, 0x080c, 0xaf03, 0x080c, ++ 0x580a, 0x001e, 0x080c, 0xae48, 0x00de, 0x080c, 0xae54, 0xace0, ++ 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xbf0b, ++ 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, ++ 0x00ee, 0x0005, 0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128, ++ 0x080c, 0xc4d7, 0x080c, 0xc141, 0x08f8, 0x00de, 0x0c00, 0xa786, ++ 0x0009, 0x1548, 0x6000, 0xa086, 0x0004, 0x1128, 0x00c6, 0x080c, ++ 0x761a, 0x00ce, 0x00e8, 0x6000, 0xa086, 0x0003, 0x11c8, 0x080c, ++ 0x7e47, 0x00e6, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, 0x0140, ++ 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x080c, 0x580a, ++ 0x00de, 0x00ee, 0x00c6, 0x080c, 0x95e3, 0x00ce, 0x080c, 0x7f6e, ++ 0x00de, 0x0804, 0xbf6f, 0xa786, 0x000a, 0x0904, 0xbf5f, 0x0804, ++ 0xbf5d, 0x080c, 0xc1c8, 0x1904, 0xbf6f, 0x81ff, 0x0904, 0xbf6f, ++ 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x0138, 0xa180, 0x0001, ++ 0x2004, 0xa086, 0x002d, 0x1904, 0xbf6f, 0x6000, 0xa086, 0x0002, ++ 0x1904, 0xbf6f, 0x080c, 0xae7e, 0x0138, 0x080c, 0xae8f, 0x1904, ++ 0xbf6f, 0x080c, 0x9c09, 0x0038, 0x080c, 0x2e6c, 0x080c, 0xae8f, ++ 0x1110, 0x080c, 0x9c09, 0x080c, 0xae54, 0x0804, 0xbf6f, 0x00c6, ++ 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006, 0x080c, 0xc162, 0x001e, ++ 0x0120, 0x601c, 0xa084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, ++ 0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc00a, 0xc008, ++ 0xa006, 0x0005, 0x0046, 0x0016, 0x7018, 0xa080, 0x0028, 0x2024, ++ 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xc190, ++ 0x001e, 0x004e, 0x0036, 0x2019, 0x0002, 0x080c, 0xbd55, 0x003e, ++ 0xa085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x527f, 0x0156, ++ 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, 0x2011, ++ 0xcc96, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, ++ 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026, ++ 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0xce00, 0x2079, 0x0001, ++ 0x8fff, 0x0904, 0xc097, 0x2071, 0xc600, 0x7648, 0x7068, 0x8001, ++ 0xa602, 0x1a04, 0xc097, 0x88ff, 0x0128, 0x2800, 0xac06, 0x15b0, ++ 0x2079, 0x0000, 0x080c, 0xc1b8, 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, 0xc3e2, ++ 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, 0x1953, ++ 0x6010, 0x2068, 0x080c, 0xac91, 0x0120, 0x0046, 0x080c, 0xc141, ++ 0x004e, 0x00de, 0x080c, 0xae54, 0x88ff, 0x1198, 0xace0, 0x0018, ++ 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xc048, 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, 0x8fc9, 0x009e, 0x008e, 0x2039, 0x0000, ++ 0x080c, 0x906f, 0x080c, 0xc039, 0x005e, 0x007e, 0x0005, 0x0026, ++ 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, ++ 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x533d, 0x11b0, ++ 0x2c10, 0x0056, 0x0086, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, ++ 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039, ++ 0x0000, 0x080c, 0x906f, 0x080c, 0xc039, 0x005e, 0x003e, 0x001e, ++ 0x8108, 0x1f04, 0xc0cb, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, ++ 0x002e, 0x0005, 0x0076, 0x0056, 0x6218, 0x0086, 0x2041, 0x0000, ++ 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x2049, 0x0000, 0x080c, ++ 0x8fc9, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x906f, 0x2c20, ++ 0x080c, 0xc039, 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, ++ 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x0016, 0x0036, 0x080c, 0x533d, 0x11c0, 0x2c10, 0x0086, 0x2041, ++ 0x0000, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xc3c4, 0x004e, ++ 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039, ++ 0x0000, 0x080c, 0x906f, 0x080c, 0xc039, 0x003e, 0x001e, 0x8108, ++ 0x1f04, 0xc118, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, ++ 0x0005, 0x0016, 0x00f6, 0x3800, 0xd08c, 0x0130, 0xad82, 0x1000, ++ 0x02b0, 0xad82, 0xc600, 0x0230, 0xad82, 0xfe00, 0x0280, 0xad82, ++ 0xffff, 0x1268, 0x6800, 0xa07d, 0x0138, 0x6803, 0x0000, 0x6b52, ++ 0x080c, 0x580a, 0x2f68, 0x0cb0, 0x6b52, 0x080c, 0x580a, 0x00fe, ++ 0x001e, 0x0005, 0x00e6, 0x0046, 0x0036, 0x2061, 0xce00, 0xa005, ++ 0x1138, 0x2071, 0xc600, 0x7448, 0x7068, 0x8001, 0xa402, 0x12d8, ++ 0x2100, 0xac06, 0x0168, 0x6000, 0xa086, 0x0000, 0x0148, 0x6008, ++ 0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406, 0x0140, ++ 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1220, 0x0c40, ++ 0xa085, 0x0001, 0x0008, 0xa006, 0x003e, 0x004e, 0x00ee, 0x0005, ++ 0x00d6, 0x0006, 0x080c, 0x1602, 0x000e, 0x090c, 0x1519, 0x6837, ++ 0x010d, 0x685e, 0x0026, 0x2010, 0x080c, 0xac81, 0x2001, 0x0000, ++ 0x0120, 0x2200, 0xa080, 0x0014, 0x2004, 0x002e, 0x684a, 0x6956, ++ 0x6c46, 0x684f, 0x0000, 0x2001, 0xc905, 0x2004, 0x6852, 0xa006, ++ 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x580a, 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, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x001e, 0x0005, 0xe000, 0xe000, 0x0005, 0x6020, 0xd0e4, 0x0158, ++ 0xd0cc, 0x0118, 0x080c, 0xaf6c, 0x0030, 0x080c, 0xc3e2, 0x080c, ++ 0x7103, 0x080c, 0x95e3, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, ++ 0x000f, 0x0002, 0xc20b, 0xc20b, 0xc20b, 0xc210, 0xc20b, 0xc20d, ++ 0xc20d, 0xc20b, 0xc20d, 0xa006, 0x0005, 0x00c6, 0x2260, 0x00ce, ++ 0xa085, 0x0001, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, ++ 0x0002, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc22d, ++ 0xc222, 0xc222, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, ++ 0x6003, 0x0001, 0x080c, 0x7999, 0x0005, 0x00c6, 0x2260, 0x080c, ++ 0xc3e2, 0x603f, 0x0000, 0x6020, 0xc0f4, 0xc0cc, 0x6022, 0x6037, ++ 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, 0x0007, 0x1904, 0xc288, ++ 0x6810, 0xa005, 0x0138, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x1110, ++ 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x7999, ++ 0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, 0x1904, ++ 0xc311, 0x6010, 0xa005, 0x1138, 0x6000, 0xa086, 0x0007, 0x190c, ++ 0x1519, 0x0804, 0xc311, 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, 0xbbcb, 0x0804, 0xc311, 0x2009, 0x0041, 0x0804, 0xc30b, ++ 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc, ++ 0x1118, 0x00de, 0x0804, 0xc222, 0xd0b4, 0x0128, 0xd0fc, 0x090c, ++ 0x1519, 0x0804, 0xc240, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, ++ 0x7999, 0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, ++ 0x0120, 0xa186, 0x0004, 0x1904, 0xc311, 0x2071, 0xc96a, 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, ++ 0xc30b, 0x0036, 0x00d6, 0x00d6, 0x080c, 0x1602, 0x003e, 0x090c, ++ 0x1519, 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, 0x580a, ++ 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xbd55, 0x2d00, 0x600a, ++ 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, 0x0000, ++ 0x00de, 0x003e, 0x0038, 0x603f, 0x0000, 0x6003, 0x0007, 0x080c, ++ 0xbbcb, 0x00ce, 0x00de, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, ++ 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186, 0x0027, 0x1178, 0x080c, ++ 0x7db1, 0x0036, 0x00d6, 0x6010, 0x2068, 0x2019, 0x0004, 0x080c, ++ 0xc141, 0x00de, 0x003e, 0x080c, 0x7e94, 0x0005, 0xa186, 0x0014, ++ 0x0d70, 0x080c, 0x962a, 0x0005, 0xc33d, 0xc33b, 0xc33b, 0xc33b, ++ 0xc33b, 0xc33b, 0xc33d, 0x080c, 0x1519, 0x080c, 0x7db1, 0x6003, ++ 0x000c, 0x080c, 0x7e94, 0x0005, 0xa182, 0x008c, 0x1220, 0xa182, ++ 0x0085, 0x0208, 0x001a, 0x080c, 0x962a, 0x0005, 0xc355, 0xc355, ++ 0xc355, 0xc355, 0xc357, 0xc375, 0xc355, 0x080c, 0x1519, 0x00d6, ++ 0x2c68, 0x080c, 0x958d, 0x01a0, 0x6003, 0x0001, 0x6007, 0x001e, ++ 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f, 0x210c, 0x613a, ++ 0x600b, 0xffff, 0x6918, 0x611a, 0x601f, 0x0004, 0x080c, 0x7999, ++ 0x2d60, 0x080c, 0x95e3, 0x00de, 0x0005, 0x080c, 0x95e3, 0x0005, ++ 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x6010, ++ 0xa08c, 0xf000, 0x0904, 0xc3c3, 0xa080, 0x0013, 0x200c, 0xd1ec, ++ 0x05d0, 0x2001, 0xc672, 0x2004, 0xd0ec, 0x05a8, 0x6003, 0x0002, ++ 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180, 0x00f6, 0x2c78, 0x080c, ++ 0x56bf, 0x00fe, 0x0150, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x2009, ++ 0xc672, 0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, 0xc672, 0x210c, ++ 0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022, 0xa006, 0x00a0, 0x2001, ++ 0xc8ff, 0x200c, 0x8103, 0xa100, 0x603e, 0x6018, 0xa088, 0x002f, ++ 0x2104, 0xa005, 0x0118, 0xa088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, ++ 0x0000, 0xa085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6150, ++ 0xa2f0, 0x002f, 0x2e04, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, ++ 0x6050, 0xa106, 0x1138, 0x600c, 0x2072, 0x080c, 0x7103, 0x080c, ++ 0x95e3, 0x0010, 0xacf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, ++ 0x001e, 0x0005, 0x00d6, 0x6018, 0xa0e8, 0x002f, 0x2d04, 0xa005, ++ 0x0140, 0xac06, 0x0120, 0x2d04, 0xa0e8, 0x0003, 0x0cb8, 0x600c, ++ 0x206a, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0xc628, ++ 0x2204, 0xa084, 0x00ff, 0x2019, 0xcc8e, 0x2334, 0xa636, 0x11d8, ++ 0x8318, 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x11a0, 0x2011, ++ 0xcc90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, ++ 0x1150, 0x2011, 0xcc94, 0x6018, 0xa098, 0x0006, 0x20a9, 0x0004, ++ 0x080c, 0xa103, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, ++ 0x2071, 0xc600, 0x080c, 0x4f02, 0x080c, 0x2c62, 0x00ee, 0x0005, ++ 0x00d6, 0x080c, 0x15e5, 0x0500, 0x2d10, 0xa290, 0x000d, 0x2013, ++ 0x0134, 0x8210, 0x2013, 0x0000, 0x8210, 0x703c, 0x2012, 0x8210, ++ 0x7038, 0x2012, 0x8210, 0x2218, 0x7048, 0x2012, 0x8210, 0x704c, ++ 0x2012, 0x8210, 0x7050, 0x2012, 0x8210, 0x7054, 0x2012, 0x2300, ++ 0x080c, 0x3e8f, 0x080c, 0x580a, 0x00de, 0x0005, 0x00d6, 0x0026, ++ 0x080c, 0x1602, 0x090c, 0x1519, 0xad90, 0x000e, 0x20a9, 0x000c, ++ 0x22a0, 0xa016, 0x42a4, 0xa186, 0x0046, 0x1118, 0x6837, 0x0136, ++ 0x0038, 0x6837, 0x0138, 0xa186, 0x0041, 0x0110, 0x684b, 0x0001, ++ 0x7038, 0xa084, 0xff00, 0x7240, 0xa294, 0xff00, 0x8007, 0xa215, ++ 0x6a6a, 0xa186, 0x0046, 0x1168, 0x7038, 0xa084, 0x00ff, 0x723c, ++ 0xa294, 0xff00, 0xa215, 0x6a6e, 0x723c, 0xa294, 0x00ff, 0x6a72, ++ 0x0060, 0x7040, 0xa084, 0x00ff, 0x7244, 0xa294, 0xff00, 0xa215, ++ 0x6a6e, 0x7244, 0xa294, 0x00ff, 0x6a72, 0xa186, 0x0046, 0x1118, ++ 0xae90, 0x0012, 0x0010, 0xae90, 0x001a, 0x2204, 0x8007, 0x6876, ++ 0x8210, 0x2204, 0x8007, 0x687a, 0x8210, 0x2204, 0x8007, 0x687e, ++ 0x8210, 0x2204, 0x8007, 0x6882, 0x8210, 0xa186, 0x0046, 0x1118, ++ 0xae90, 0x0016, 0x0010, 0xae90, 0x001e, 0x2204, 0x8007, 0x6886, ++ 0x8210, 0x2204, 0x8007, 0x688a, 0x8210, 0x2204, 0x8007, 0x688e, ++ 0x8210, 0x2204, 0x8007, 0x6892, 0x8210, 0xa186, 0x0046, 0x1118, ++ 0xae90, 0x0022, 0x0010, 0xae90, 0x002a, 0x00d6, 0xade8, 0x0025, ++ 0x20a9, 0x0008, 0x2204, 0x8007, 0x206a, 0x8210, 0x8d68, 0x1f04, ++ 0xc4ca, 0x00de, 0x002e, 0x080c, 0x580a, 0x00de, 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, ++ 0xc930, 0x252c, 0x2021, 0xc936, 0x2424, 0x2061, 0xce00, 0x2071, ++ 0xc600, 0x7648, 0x7068, 0xa606, 0x0578, 0x671c, 0xa786, 0x0001, ++ 0x0118, 0xa786, 0x0008, 0x1500, 0x2500, 0xac06, 0x01e8, 0x2400, ++ 0xac06, 0x01d0, 0x080c, 0xc1b8, 0x01b8, 0x080c, 0xc1c8, 0x11a0, ++ 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953, 0x001e, ++ 0x080c, 0xae7e, 0x1110, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x1110, ++ 0x080c, 0x9c09, 0x080c, 0xae54, 0xace0, 0x0018, 0x2001, 0xc617, ++ 0x2004, 0xac02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, ++ 0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006, ++ 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xc640, 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, 0xc64a, ++ 0x04c9, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, ++ 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xc640, 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, 0xc64a, ++ 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, ++ 0x00e6, 0x2091, 0x8000, 0x2071, 0xc642, 0x0021, 0x00ee, 0x000e, ++ 0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, ++ 0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0xc640, 0x0c99, 0x00ee, ++ 0x0005, 0x00e6, 0x2071, 0xc644, 0x0c69, 0x00ee, 0x0005, 0x0126, ++ 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xc640, 0x7044, 0x8000, ++ 0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002, 0x0004, ++ 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, ++ 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xb0c4 ++}; ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_length01 = 0xb5c6; ++#else ++unsigned short risc_code_length01 = 0xb5c6; ++#endif ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2300tpx_fw.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,6494 @@ ++/************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ *************************************************************************/ ++/* ++ * Firmware Version 3.02.10 (14:20 Apr 17, 2003) ++ */ ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_version = 3*1024+2; ++#else ++unsigned short risc_code_version = 3*1024+2; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned char fw2300tpx_version_str[] = {3, 2,10}; ++#else ++unsigned char firmware_version[] = {3, 2,10}; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++#define fw2300tpx_VERSION_STRING "3.02.10" ++#else ++#define FW_VERSION_STRING "3.02.10" ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_addr01 = 0x0800 ; ++#else ++unsigned short risc_code_addr01 = 0x0800 ; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_code01[] = { ++#else ++unsigned short risc_code01[] = { ++#endif ++ 0x0470, 0x0000, 0x0000, 0xc920, 0x0000, 0x0003, 0x0002, 0x000a, ++ 0x0117, 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, 0x3032, 0x2e31, 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, ++ 0x1bff, 0x2059, 0x0000, 0x2b78, 0x7883, 0x0004, 0x2089, 0x28b1, ++ 0x2051, 0x1800, 0x2a70, 0x20e1, 0x0001, 0x20e9, 0x0001, 0x2029, ++ 0x4d00, 0x2031, 0xffff, 0x2039, 0x4cd0, 0x2021, 0x0200, 0x20e9, ++ 0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9, ++ 0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff, ++ 0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8, ++ 0x4104, 0x8001, 0x1de0, 0x7566, 0x766a, 0x7762, 0x746e, 0x7472, ++ 0x00e6, 0x2071, 0x1a8a, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 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, ++ 0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f, ++ 0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e, ++ 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0ec6, 0x080c, ++ 0x56e7, 0x080c, 0x94ea, 0x080c, 0x107b, 0x080c, 0x1245, 0x080c, ++ 0x18ae, 0x080c, 0x0d1d, 0x080c, 0x1000, 0x080c, 0x2f6e, 0x080c, ++ 0x6b54, 0x080c, 0x5f51, 0x080c, 0x774d, 0x080c, 0x20b6, 0x080c, ++ 0x7a7b, 0x080c, 0x7190, 0x080c, 0x1ef3, 0x080c, 0x2027, 0x080c, ++ 0x20ab, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880, ++ 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, ++ 0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, ++ 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1800, 0x7003, ++ 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, ++ 0x44bf, 0x080c, 0x2f92, 0x080c, 0x6bc5, 0x080c, 0x63e8, 0x080c, ++ 0x7778, 0x080c, 0x2849, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, ++ 0x0ab2, 0x093e, 0x0b69, 0x0d14, 0x0d14, 0x0d14, 0x080c, 0x0d84, ++ 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, ++ 0x1904, 0x0a90, 0x080c, 0x0e2c, 0x080c, 0x6877, 0x0150, 0x080c, ++ 0x689a, 0x1580, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, ++ 0x0448, 0x080c, 0x67be, 0x7000, 0x9086, 0x0001, 0x1904, 0x0a90, ++ 0x7090, 0x9086, 0x0028, 0x1904, 0x0a90, 0x2001, 0x0161, 0x2003, ++ 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, ++ 0x7a2a, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c, ++ 0x78e7, 0x2011, 0x554d, 0x080c, 0x781a, 0x2011, 0x8030, 0x901e, ++ 0x738e, 0x0460, 0x080c, 0x4e04, 0x2079, 0x0100, 0x7844, 0x9005, ++ 0x1904, 0x0a90, 0x2011, 0x554d, 0x080c, 0x781a, 0x2001, 0x0265, ++ 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, ++ 0x2001, 0x1973, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, ++ 0x080c, 0x568f, 0x00ce, 0x0804, 0x0a90, 0x780f, 0x006b, 0x7a28, ++ 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1974, ++ 0x2003, 0x0001, 0x080c, 0x2718, 0x080c, 0x447f, 0x7240, 0xc284, ++ 0x7242, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, ++ 0x8d36, 0x2011, 0x0004, 0x080c, 0xb0b9, 0x080c, 0x5e30, 0x080c, ++ 0x6877, 0x1120, 0x080c, 0x275c, 0x02e0, 0x0400, 0x080c, 0x5696, ++ 0x0140, 0x708f, 0x0001, 0x70cf, 0x0000, 0x080c, 0x4fc7, 0x0804, ++ 0x0a90, 0x080c, 0x4dea, 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, ++ 0xc0cd, 0x2012, 0x080c, 0x4dee, 0xd0d4, 0x1118, 0x080c, 0x275c, ++ 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x4dee, ++ 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, ++ 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x5f25, 0x1128, 0xd0a4, ++ 0x0118, 0x2204, 0xc0fd, 0x2012, 0x080c, 0x5eeb, 0x0120, 0x7a0c, ++ 0xc2b4, 0x7a0e, 0x00a8, 0x7077, 0x0000, 0x080c, 0x6877, 0x1130, ++ 0x70a8, 0x9005, 0x1168, 0x080c, 0xb4bd, 0x0050, 0x080c, 0xb4bd, ++ 0x70d8, 0xd09c, 0x1128, 0x70a8, 0x9005, 0x0110, 0x080c, 0x5677, ++ 0x70e3, 0x0000, 0x70df, 0x0000, 0x709f, 0x0000, 0x72d8, 0x080c, ++ 0x6877, 0x1170, 0x9016, 0x0016, 0x080c, 0x2515, 0x2019, 0x193c, ++ 0x211a, 0x001e, 0x7057, 0xffff, 0x705b, 0x00ef, 0x707b, 0x0000, ++ 0x2079, 0x1852, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72da, 0x080c, ++ 0x6877, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, ++ 0xb0b9, 0x70a3, 0x0000, 0x70a7, 0xffff, 0x7003, 0x0002, 0x2079, ++ 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, ++ 0x080c, 0x2b1e, 0x2011, 0x0005, 0x080c, 0x8e99, 0x080c, 0x8125, ++ 0x080c, 0x6877, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, ++ 0x2515, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x70a3, 0x0000, ++ 0x70a7, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, ++ 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, ++ 0x080c, 0x8e99, 0x080c, 0x8125, 0x080c, 0x6877, 0x0148, 0x00c6, ++ 0x2061, 0x0100, 0x0016, 0x080c, 0x2515, 0x61e2, 0x001e, 0x00ce, ++ 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x6877, 0x1118, 0x20a9, ++ 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6877, 0x1110, 0x900e, ++ 0x0010, 0x2009, 0x007e, 0x080c, 0x2e11, 0x8108, 0x1f04, 0x0aa3, ++ 0x7077, 0x0000, 0x7078, 0x9084, 0x00ff, 0x707a, 0x70ab, 0x0000, ++ 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, ++ 0x0002, 0x1904, 0x0b66, 0x70a4, 0x9086, 0xffff, 0x0130, 0x080c, ++ 0x2b1e, 0x080c, 0x8125, 0x0804, 0x0b66, 0x70d8, 0xd0ac, 0x1110, ++ 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003, ++ 0x002b, 0x000e, 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, ++ 0x080c, 0x2c86, 0x080c, 0x8125, 0x70d8, 0xd094, 0x1904, 0x0b66, ++ 0x2011, 0x0001, 0x080c, 0xb759, 0x0110, 0x2011, 0x0003, 0x901e, ++ 0x080c, 0x2cc0, 0x080c, 0x8125, 0x0804, 0x0b66, 0x70e0, 0x9005, ++ 0x1904, 0x0b66, 0x70a0, 0x9005, 0x1904, 0x0b66, 0x70d8, 0xd0a4, ++ 0x0118, 0xd0b4, 0x0904, 0x0b66, 0x080c, 0x5eeb, 0x1904, 0x0b66, ++ 0x080c, 0x5f3e, 0x1904, 0x0b66, 0x080c, 0x5f25, 0x01c0, 0x0156, ++ 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5c0d, 0x1118, ++ 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b0c, 0x00ce, ++ 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b66, 0x0006, ++ 0x2001, 0x0103, 0x2003, 0x006b, 0x000e, 0x2011, 0x1980, 0x080c, ++ 0x0f36, 0x2011, 0x199a, 0x080c, 0x0f36, 0x7030, 0xc08c, 0x7032, ++ 0x7003, 0x0003, 0x70a7, 0xffff, 0x080c, 0x0e0e, 0x9006, 0x080c, ++ 0x23a6, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, ++ 0x44f9, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x689a, ++ 0x0150, 0x080c, 0x6877, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, ++ 0x9084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0x19b5, 0x2004, 0x9086, ++ 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8e99, 0x2011, 0x0000, ++ 0x080c, 0x8ea3, 0x080c, 0x8125, 0x080c, 0x820b, 0x012e, 0x00be, ++ 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, ++ 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, ++ 0x5660, 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, ++ 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, ++ 0x0156, 0x7954, 0xd1ac, 0x1904, 0x0bf6, 0x2001, 0x1974, 0x2004, ++ 0x9005, 0x1518, 0x080c, 0x27d7, 0x1148, 0x2001, 0x0001, 0x080c, ++ 0x2747, 0x2001, 0x0001, 0x080c, 0x272a, 0x00b8, 0x080c, 0x27df, ++ 0x1138, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, 0x0068, ++ 0x080c, 0x27e7, 0x1d50, 0x2001, 0x1965, 0x2004, 0xd0fc, 0x0108, ++ 0x0020, 0x080c, 0x2541, 0x0804, 0x0cd6, 0x080c, 0x6888, 0x0148, ++ 0x080c, 0x689a, 0x1118, 0x080c, 0x6b4f, 0x0050, 0x080c, 0x687f, ++ 0x0dd0, 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x67be, 0x0058, ++ 0x080c, 0x6877, 0x0140, 0x2009, 0x00f8, 0x080c, 0x5660, 0x7843, ++ 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, ++ 0x080c, 0x6877, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0cdb, 0x1f04, ++ 0x0bd5, 0x0070, 0x7824, 0x080c, 0x6891, 0x0118, 0xd0ac, 0x1904, ++ 0x0cdb, 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0cdb, ++ 0x2001, 0x0001, 0x080c, 0x23a6, 0x0804, 0x0cee, 0x2001, 0x1974, ++ 0x2004, 0x9005, 0x1518, 0x080c, 0x27d7, 0x1148, 0x2001, 0x0001, ++ 0x080c, 0x2747, 0x2001, 0x0001, 0x080c, 0x272a, 0x00b8, 0x080c, ++ 0x27df, 0x1138, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, ++ 0x0068, 0x080c, 0x27e7, 0x1d50, 0x2001, 0x1965, 0x2004, 0xd0fc, ++ 0x0108, 0x0020, 0x080c, 0x2541, 0x0804, 0x0cd6, 0x7850, 0x9085, ++ 0x0040, 0x7852, 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, ++ 0x27ef, 0x9085, 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, ++ 0x0c2f, 0x080c, 0x78c7, 0x1f04, 0x0c2f, 0x7850, 0x9085, 0x0400, ++ 0x9084, 0xdfbf, 0x7852, 0x793a, 0x080c, 0x6888, 0x0148, 0x080c, ++ 0x689a, 0x1118, 0x080c, 0x6b4f, 0x0050, 0x080c, 0x687f, 0x0dd0, ++ 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x67be, 0x0020, 0x2009, ++ 0x00f8, 0x080c, 0x5660, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c55, ++ 0x7850, 0x9085, 0x1400, 0x7852, 0x080c, 0x6877, 0x0120, 0x7843, ++ 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x080c, ++ 0x0d15, 0x7820, 0xd09c, 0x1588, 0x080c, 0x6877, 0x0904, 0x0cbb, ++ 0x7824, 0xd0ac, 0x1904, 0x0cdb, 0x080c, 0x689a, 0x1530, 0x0046, ++ 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, ++ 0x27ef, 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, ++ 0x2001, 0x180f, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0cfc, ++ 0x8421, 0x1158, 0x1d04, 0x0c96, 0x080c, 0x78c7, 0x080c, 0x6b4a, ++ 0x080c, 0x6b40, 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, ++ 0x0ca3, 0x080c, 0x78c7, 0x2009, 0x1968, 0x2104, 0x9005, 0x0118, ++ 0x8001, 0x200a, 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, ++ 0x0002, 0x080c, 0x27d0, 0x7924, 0x080c, 0x27ef, 0xd19c, 0x0110, ++ 0x080c, 0x2718, 0x00d8, 0x080c, 0x6888, 0x1140, 0x94a2, 0x03e8, ++ 0x1128, 0x080c, 0x6853, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, ++ 0x080c, 0x27ef, 0x7824, 0x080c, 0x6891, 0x0110, 0xd0ac, 0x1158, ++ 0x9084, 0x1800, 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, ++ 0x080c, 0x23a6, 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, ++ 0x7904, 0x918d, 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, ++ 0x0028, 0x782a, 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1974, ++ 0x2003, 0x0000, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, ++ 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, ++ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x2f92, ++ 0x0061, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, ++ 0x003e, 0x001e, 0x000e, 0x0005, 0x0005, 0x080c, 0xb759, 0x0120, ++ 0x1d04, 0x0d1c, 0x080c, 0x78c7, 0x0005, 0x2a70, 0x2061, 0x1978, ++ 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x000a, 0x600f, 0x0117, ++ 0x2001, 0x194b, 0x900e, 0x2102, 0x718e, 0x2001, 0x0100, 0x2004, ++ 0x9082, 0x0002, 0x0218, 0x7057, 0xffff, 0x0008, 0x7156, 0x705f, ++ 0xffff, 0x7176, 0x717a, 0x080c, 0xb4bd, 0x70ef, 0x00c0, 0x2061, ++ 0x193b, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, 0x0200, ++ 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, 0x2061, ++ 0x1943, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, 0x6013, ++ 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x1956, 0x6003, ++ 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, ++ 0x182a, 0x2102, 0x0005, 0x9016, 0x080c, 0x5c0d, 0x1178, 0xb804, ++ 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00, 0x98c6, ++ 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, 0x8108, 0x9186, ++ 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, 0x0e04, 0x0d86, ++ 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e, ++ 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886, ++ 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6, ++ 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a65, 0x7a18, 0x226a, ++ 0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1a72, 0x201a, 0x2019, ++ 0x1a75, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, ++ 0x8318, 0x9386, 0x1a8a, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, ++ 0x2011, 0xdead, 0x2019, 0x1a73, 0x782c, 0x201a, 0x8318, 0x221a, ++ 0x7803, 0x0000, 0x2069, 0x1a45, 0x901e, 0x20a9, 0x0020, 0x7b26, ++ 0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0dcf, 0x002e, 0x003e, ++ 0x00de, 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x19e7, 0x2004, ++ 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, ++ 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x4df9, 0x1108, ++ 0x0011, 0x0cd8, 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, ++ 0x0e8d, 0x20a9, 0x0900, 0x080c, 0x0eae, 0x2011, 0x0040, 0x080c, ++ 0x0e8d, 0x20a9, 0x0900, 0x080c, 0x0eae, 0x0c78, 0x0026, 0x080c, ++ 0x0e9a, 0x1118, 0x2011, 0x0040, 0x0098, 0x2011, 0x010e, 0x2214, ++ 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, ++ 0x2011, 0x6840, 0xd0e4, 0x70f3, 0x0000, 0x1128, 0x70f3, 0x0fa0, ++ 0x080c, 0x0e9f, 0x002e, 0x0005, 0x0026, 0x080c, 0x0e9a, 0x0128, ++ 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, ++ 0x0e9f, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c, 0x0e9a, ++ 0x1148, 0x080c, 0x27e7, 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, ++ 0x8282, 0x0040, 0x080c, 0x27e7, 0x1118, 0x2011, 0xcdc5, 0x0010, ++ 0x2011, 0xcac2, 0x080c, 0x0e9f, 0x002e, 0x0005, 0x00e6, 0x0006, ++ 0x2071, 0x1800, 0xd0b4, 0x70ec, 0x1148, 0xc0e4, 0x0080, 0x70ee, ++ 0x0026, 0x9094, 0x00c0, 0x0449, 0x002e, 0x0048, 0x0006, 0x3b00, ++ 0x9084, 0xff3f, 0x20d8, 0x000e, 0x70f3, 0x0000, 0xc0e5, 0x0079, ++ 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, 0x70ec, ++ 0x1110, 0xc0dc, 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, 0x70ee, ++ 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0e55, 0x0e2c, 0x0e2c, ++ 0x0e0e, 0x0e3b, 0x0e2c, 0x0e2c, 0x0e3b, 0x0016, 0x3b08, 0x3a00, ++ 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, ++ 0x001e, 0x0005, 0x2001, 0x183b, 0x2004, 0xd0dc, 0x0005, 0x9e86, ++ 0x1800, 0x190c, 0x0d84, 0x70ec, 0xd0e4, 0x0108, 0xc2e5, 0x72ee, ++ 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0eae, ++ 0x2091, 0x6000, 0x1f04, 0x0eae, 0x0005, 0x890e, 0x810e, 0x810f, ++ 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, ++ 0x894f, 0x894d, 0x894d, 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, ++ 0x0036, 0x0096, 0x2061, 0x1882, 0x600b, 0x0000, 0x600f, 0x0000, ++ 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, ++ 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, ++ 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, ++ 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, ++ 0x1892, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, ++ 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, ++ 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, ++ 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, ++ 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, ++ 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, ++ 0x0096, 0x3348, 0x080c, 0x0eb5, 0x2100, 0x9300, 0x2098, 0x22e0, ++ 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, ++ 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, ++ 0x71b0, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, ++ 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, ++ 0x9298, 0x0008, 0x23a0, 0x4001, 0x7074, 0x8007, 0x7178, 0x810f, ++ 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, ++ 0x0d6b, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, ++ 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x0fe0, ++ 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x1057, ++ 0x090c, 0x0d84, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, ++ 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, ++ 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0d84, ++ 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0d84, 0xa000, 0x0c98, 0x012e, ++ 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, ++ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1904, 0x7010, 0x9005, ++ 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0d84, 0xa000, ++ 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, ++ 0x1800, 0x0126, 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, ++ 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, ++ 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, ++ 0x0268, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, ++ 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, ++ 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, ++ 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x012e, 0x00ee, 0x0005, ++ 0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, ++ 0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, ++ 0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, ++ 0x1882, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0534, 0xa802, 0x2048, ++ 0x2009, 0x4d00, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, ++ 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, ++ 0x2071, 0x1882, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, ++ 0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, ++ 0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, ++ 0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, ++ 0xa803, 0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, ++ 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, ++ 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0534, 0x0288, ++ 0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, ++ 0x1882, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, ++ 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e6, 0x7007, 0x0000, ++ 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, ++ 0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, ++ 0xa06f, 0x0000, 0x2071, 0x19e6, 0x701c, 0x9088, 0x19f0, 0x280a, ++ 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d84, ++ 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, ++ 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, ++ 0x19e6, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, ++ 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, ++ 0x7007, 0x0006, 0x7000, 0x0002, 0x10ce, 0x10cc, 0x10cc, 0x10cc, ++ 0x1234, 0x1234, 0x1234, 0x1234, 0x080c, 0x0d84, 0x701c, 0x7120, ++ 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, ++ 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f0, 0x2004, 0x700a, ++ 0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, ++ 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, ++ 0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 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, 0x19e6, ++ 0x2104, 0xc095, 0x200a, 0x080c, 0x10ab, 0x0005, 0x0016, 0x00e6, ++ 0x2071, 0x19e6, 0x00f6, 0x2079, 0x0080, 0x792c, 0x782b, 0x0002, ++ 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, ++ 0x001e, 0x0005, 0x10bc, 0x1161, 0x1195, 0x0d84, 0x0d84, 0x1240, ++ 0x0d84, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014, ++ 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, ++ 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e, ++ 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806, ++ 0x080c, 0x1101, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, ++ 0x009e, 0x7007, 0x0000, 0x080c, 0x10bc, 0x0005, 0x7008, 0x0096, ++ 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, ++ 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, ++ 0x1116, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, ++ 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e, ++ 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100, ++ 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001, ++ 0x18ad, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, ++ 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, ++ 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, ++ 0x080c, 0x10ab, 0x0005, 0x00de, 0x009e, 0x080c, 0x10ab, 0x0005, ++ 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0d84, ++ 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, ++ 0xa897, 0x4002, 0x080c, 0x619c, 0xa09f, 0x0000, 0xa0a3, 0x0000, ++ 0x2848, 0x080c, 0x0fe0, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, ++ 0x090c, 0x0d84, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001, ++ 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198, ++ 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084, ++ 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810, ++ 0x080c, 0x108c, 0x0078, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, ++ 0x619c, 0x000e, 0x001e, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, ++ 0x9554, 0x00ce, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, ++ 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, ++ 0x7007, 0x0000, 0x080c, 0x10bc, 0x0005, 0x0126, 0x2091, 0x2200, ++ 0x2079, 0x0300, 0x2071, 0x1a30, 0x7003, 0x0000, 0x78bf, 0x00f6, ++ 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x01ec, 0x2061, ++ 0xcd39, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04, ++ 0x1259, 0x7807, 0x0001, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, ++ 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110, 0x7820, ++ 0x0cd8, 0x2001, 0x1a31, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, ++ 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0001, 0x7827, 0x0030, ++ 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a45, 0x781f, 0xff00, ++ 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, ++ 0x0303, 0x2061, 0x1a45, 0x602f, 0x1cd0, 0x2001, 0x1818, 0x2004, ++ 0x9082, 0x1cd0, 0x6032, 0x603b, 0x1cdd, 0x00ce, 0x0005, 0x0126, ++ 0x2091, 0x2200, 0x7808, 0xd09c, 0x0158, 0x7820, 0x908c, 0xf000, ++ 0x1588, 0x908a, 0x0021, 0x1a0c, 0x0d84, 0x0043, 0x012e, 0x0005, ++ 0x9084, 0x0070, 0x190c, 0x0d84, 0x012e, 0x0005, 0x12d8, 0x12d8, ++ 0x12e1, 0x12e6, 0x12ea, 0x12ef, 0x1317, 0x131b, 0x1329, 0x132d, ++ 0x12d8, 0x13b6, 0x13ba, 0x141a, 0x12d8, 0x12d8, 0x12d8, 0x12d8, ++ 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, ++ 0x12d8, 0x12f1, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, ++ 0x080c, 0x0d84, 0x2009, 0x0048, 0x2060, 0x080c, 0x95ce, 0x012e, ++ 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, ++ 0x7006, 0x0005, 0x080c, 0x1421, 0x080c, 0x14c5, 0x0005, 0x080c, ++ 0x0d84, 0x080c, 0x1421, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, ++ 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x95ce, 0x2001, 0x015d, ++ 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, ++ 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, ++ 0x080c, 0x1426, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, ++ 0xc095, 0x7006, 0x0005, 0x080c, 0x1421, 0x2060, 0x6014, 0x0096, ++ 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x95ce, ++ 0x0005, 0x080c, 0x1421, 0x080c, 0x0d84, 0x080c, 0x1421, 0x080c, ++ 0x13a1, 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, 0x0d84, ++ 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0478, 0x78ab, ++ 0x0004, 0x7803, 0x0001, 0x080c, 0x13ba, 0x0005, 0x7828, 0x782b, ++ 0x0000, 0x9065, 0x090c, 0x0d84, 0x6014, 0x2048, 0x78ab, 0x0004, ++ 0x918c, 0x0700, 0x0198, 0x080c, 0x724d, 0x080c, 0x1827, 0x080c, ++ 0xb0ad, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, ++ 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6010, 0x00b6, ++ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb456, 0x2029, 0x00c8, ++ 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, ++ 0x080c, 0xcce2, 0xd5a4, 0x1118, 0x080c, 0x1426, 0x0005, 0x080c, ++ 0x724d, 0x080c, 0x1827, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, ++ 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, ++ 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, ++ 0x1492, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, ++ 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0d84, 0xd184, ++ 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, ++ 0x0050, 0x2003, 0x0020, 0x080c, 0x1426, 0x0005, 0x81ff, 0x190c, ++ 0x0d84, 0x0005, 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, ++ 0x15c8, 0x2071, 0x0200, 0x080c, 0x14b9, 0x6014, 0x9005, 0x0590, ++ 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, ++ 0x0148, 0x908e, 0x0048, 0x1530, 0x00f6, 0x2c78, 0x080c, 0x150d, ++ 0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x163f, 0x00fe, 0x2009, ++ 0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, ++ 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, ++ 0x020d, 0x2003, 0x0020, 0x080c, 0x1269, 0x7803, 0x0001, 0x00ee, ++ 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, ++ 0x0069, 0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x95ce, ++ 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x13a1, ++ 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, 0x04e1, ++ 0x6827, 0x0001, 0x8109, 0x1dd8, 0x04b9, 0x6827, 0x0002, 0x04a1, ++ 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x11e0, 0x6804, 0x9005, ++ 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c8, 0x080c, 0x724d, 0x080c, ++ 0x1827, 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, 0x129f, 0x00ce, 0x002e, ++ 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, ++ 0x2009, 0xff00, 0x8109, 0x0130, 0x7818, 0xd0bc, 0x1dd8, 0x000e, ++ 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, ++ 0x0d84, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, ++ 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, ++ 0x0200, 0x0c79, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, ++ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb431, ++ 0xab42, 0xac3e, 0x2001, 0x1874, 0x2004, 0xd0b4, 0x1170, 0x601c, ++ 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, ++ 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1cfd, 0x1190, ++ 0x080c, 0x168e, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, ++ 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, ++ 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, ++ 0x080c, 0x1426, 0x0005, 0x080c, 0x0d84, 0x2ff0, 0x0126, 0x2091, ++ 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, ++ 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1cdd, 0x2165, 0x0002, ++ 0x1537, 0x1584, 0x1537, 0x1537, 0x1537, 0x1566, 0x1537, 0x153b, ++ 0x1530, 0x157b, 0x1537, 0x1537, 0x1537, 0x1537, 0x154f, 0x1545, ++ 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x157b, 0x9085, ++ 0x0001, 0x0804, 0x1637, 0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842, ++ 0xa88c, 0xa83e, 0xa888, 0x0804, 0x158b, 0xa87c, 0xd0bc, 0x0d78, ++ 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x15da, 0xa87c, ++ 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, ++ 0x090c, 0x0d84, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cdd, ++ 0x2065, 0xa888, 0xd19c, 0x1904, 0x15da, 0x0428, 0xa87c, 0xd0ac, ++ 0x0970, 0xa804, 0x9045, 0x090c, 0x0d84, 0xa164, 0xa91a, 0x91ec, ++ 0x000f, 0x9d80, 0x1cdd, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, ++ 0x1904, 0x15da, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x1537, 0x9006, ++ 0xa842, 0xa83e, 0x0804, 0x15da, 0xa87c, 0xd0ac, 0x0904, 0x1537, ++ 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d84, ++ 0x9082, 0x001b, 0x0002, 0x15ae, 0x15ae, 0x15b0, 0x15ae, 0x15ae, ++ 0x15ae, 0x15b6, 0x15ae, 0x15ae, 0x15ae, 0x15bc, 0x15ae, 0x15ae, ++ 0x15ae, 0x15c2, 0x15ae, 0x15ae, 0x15ae, 0x15c8, 0x15ae, 0x15ae, ++ 0x15ae, 0x15ce, 0x15ae, 0x15ae, 0x15ae, 0x15d4, 0x080c, 0x0d84, ++ 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x161f, 0xa584, 0xa488, ++ 0xa38c, 0xa290, 0x0804, 0x161f, 0xa594, 0xa498, 0xa39c, 0xa2a0, ++ 0x0804, 0x161f, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x161f, ++ 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x161f, 0xa5c4, 0xa4c8, ++ 0xa3cc, 0xa2d0, 0x0804, 0x161f, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, ++ 0x0804, 0x161f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, ++ 0x001b, 0x0002, 0x15fd, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x15fb, ++ 0x1604, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x160b, 0x15fb, ++ 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x1612, 0x15fb, 0x15fb, 0x15fb, ++ 0x15fb, 0x15fb, 0x1619, 0x080c, 0x0d84, 0xa56c, 0xa470, 0xa774, ++ 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c, 0xa690, ++ 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, ++ 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, ++ 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0xab2e, ++ 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, ++ 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1150, 0x3e60, ++ 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, ++ 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c80, 0x2ff0, ++ 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, ++ 0x2061, 0x1cd8, 0xa80b, 0x1cd8, 0x2c05, 0xa812, 0xa964, 0xa91a, ++ 0xa87c, 0xd0ac, 0x090c, 0x0d84, 0x9006, 0xa842, 0xa83e, 0x2c05, ++ 0x908a, 0x0034, 0x1a0c, 0x0d84, 0xadcc, 0xacd0, 0xafd4, 0xaed8, ++ 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, ++ 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916, ++ 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, ++ 0x9006, 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0d84, 0xa80e, ++ 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2015, 0x82ff, ++ 0x090c, 0x0d84, 0xaa0a, 0x2205, 0xa812, 0x0c18, 0x903e, 0x2730, ++ 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1783, 0x16e5, 0x16e5, ++ 0x1783, 0x1783, 0x177d, 0x1783, 0x16e5, 0x1783, 0x1734, 0x1734, ++ 0x1783, 0x1783, 0x1783, 0x177a, 0x1734, 0xc0fc, 0xa882, 0xab2c, ++ 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1785, 0x2c05, 0x908a, ++ 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x16d1, 0x16cf, ++ 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16d5, 0x16cf, 0x16cf, 0x16cf, ++ 0x16cf, 0x16cf, 0x16d9, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16cf, ++ 0x16dd, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16e1, 0x080c, ++ 0x0d84, 0xa774, 0xa678, 0x0804, 0x1785, 0xa78c, 0xa690, 0x0804, ++ 0x1785, 0xa7a4, 0xa6a8, 0x0804, 0x1785, 0xa7bc, 0xa6c0, 0x0804, ++ 0x1785, 0xa7d4, 0xa6d8, 0x0804, 0x1785, 0x2c05, 0x908a, 0x0036, ++ 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1708, 0x1708, 0x170a, ++ 0x1708, 0x1708, 0x1708, 0x1710, 0x1708, 0x1708, 0x1708, 0x1716, ++ 0x1708, 0x1708, 0x1708, 0x171c, 0x1708, 0x1708, 0x1708, 0x1722, ++ 0x1708, 0x1708, 0x1708, 0x1728, 0x1708, 0x1708, 0x1708, 0x172e, ++ 0x080c, 0x0d84, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1785, ++ 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1785, 0xa594, 0xa498, ++ 0xa39c, 0xa2a0, 0x0804, 0x1785, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, ++ 0x0804, 0x1785, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1785, ++ 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1785, 0xa5d4, 0xa4d8, ++ 0xa3dc, 0xa2e0, 0x0804, 0x1785, 0x2c05, 0x908a, 0x0034, 0x1a0c, ++ 0x0d84, 0x9082, 0x001b, 0x0002, 0x1757, 0x1755, 0x1755, 0x1755, ++ 0x1755, 0x1755, 0x175e, 0x1755, 0x1755, 0x1755, 0x1755, 0x1755, ++ 0x1765, 0x1755, 0x1755, 0x1755, 0x1755, 0x1755, 0x176c, 0x1755, ++ 0x1755, 0x1755, 0x1755, 0x1755, 0x1773, 0x080c, 0x0d84, 0xa56c, ++ 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0438, 0xa584, 0xa488, ++ 0xa78c, 0xa690, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, ++ 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, ++ 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, ++ 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c, 0x1c9b, 0x1904, ++ 0x168e, 0x900e, 0x0050, 0x080c, 0x0d84, 0xab2e, 0xaa32, 0xad1e, ++ 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1c9b, 0x0005, 0x6014, 0x2048, ++ 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff, 0x1118, 0xa887, 0x0001, ++ 0x0008, 0xa986, 0x601b, 0x0002, 0xa974, 0xd1dc, 0x1108, 0x0005, ++ 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, ++ 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, 0x0804, 0x95ce, 0x0005, ++ 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, ++ 0x9186, 0x0000, 0x0904, 0x181c, 0x9186, 0x0003, 0x0904, 0x181c, ++ 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0190, 0x00c6, 0x7808, ++ 0xd09c, 0x190c, 0x129f, 0x00ce, 0x2001, 0x0038, 0x2c08, 0x621c, ++ 0x080c, 0x1492, 0x7930, 0x9186, 0x0040, 0x0904, 0x1818, 0x9186, ++ 0x0042, 0x190c, 0x0d84, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, ++ 0x1d28, 0x080c, 0x1876, 0x0026, 0x0056, 0x2001, 0x00d2, 0x8001, ++ 0x1df0, 0x2031, 0x2000, 0x8631, 0x1148, 0x080c, 0x724d, 0x04b9, ++ 0x601c, 0xc084, 0x601e, 0x005e, 0x002e, 0x0410, 0x2001, 0x020b, ++ 0x2004, 0xd0e4, 0x0d80, 0x2001, 0x015d, 0x2003, 0x0000, 0x78ab, ++ 0x0004, 0x2001, 0x0200, 0x200c, 0x918d, 0x1800, 0x2102, 0x080c, ++ 0x1269, 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, ++ 0x6877, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, ++ 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, ++ 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x691e, 0x006e, 0x0005, ++ 0x0469, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, ++ 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x27fb, 0x2009, 0x003c, ++ 0x080c, 0x2014, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, ++ 0x003c, 0x1de0, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e, ++ 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, ++ 0x1269, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138, ++ 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, ++ 0x080c, 0x6877, 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, 0x0126, 0x2091, ++ 0x2400, 0x2071, 0x1a33, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, ++ 0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1932, 0xa964, ++ 0x9184, 0x0007, 0x0002, 0x18cb, 0x191d, 0x18d2, 0x18d2, 0x18d2, ++ 0x1905, 0x18e5, 0x18d4, 0x2100, 0x9084, 0x00ff, 0x9086, 0x0048, ++ 0x0904, 0x191d, 0x080c, 0x0d84, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, ++ 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, ++ 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1925, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x001e, 0x1d38, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, 0xa890, ++ 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, ++ 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, ++ 0x1cdd, 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, ++ 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, 0xa804, 0xa85a, ++ 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2005, 0xa812, ++ 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, ++ 0x1ae4, 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, ++ 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2005, 0xa812, 0xa916, 0xa87c, ++ 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, ++ 0x190c, 0x1b25, 0x00e6, 0x2071, 0x1a33, 0x7000, 0x9005, 0x1904, ++ 0x198c, 0x7206, 0x9280, 0x0005, 0x204c, 0x9280, 0x0004, 0x2004, ++ 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0x00fe, ++ 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6, 0x2079, ++ 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, ++ 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, 0xa814, ++ 0x2050, 0xa858, 0x2040, 0xa810, 0x2060, 0xa064, 0x90ec, 0x000f, ++ 0xa944, 0x791a, 0x7116, 0xa848, 0x781e, 0x701a, 0x9006, 0x700e, ++ 0x7012, 0x7004, 0xa940, 0xa838, 0x9106, 0x1188, 0xa93c, 0xa834, ++ 0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126, 0x2091, 0x8000, 0x00a1, ++ 0x0108, 0x0091, 0x012e, 0x9006, 0x00ee, 0x00fe, 0x0005, 0x0036, ++ 0x0046, 0xab38, 0xac34, 0x080c, 0x1cfd, 0x004e, 0x003e, 0x0d50, ++ 0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076, 0x0066, 0x0056, 0x0046, ++ 0x0036, 0x0026, 0x8aff, 0x0904, 0x1add, 0x700c, 0x7214, 0x923a, ++ 0x7010, 0x7218, 0x9203, 0x0a04, 0x1adc, 0x9705, 0x0904, 0x1adc, ++ 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1ac0, ++ 0x1a07, 0x1a07, 0x1ac0, 0x1ac0, 0x1aa3, 0x1ac0, 0x1a07, 0x1aa9, ++ 0x1a56, 0x1a56, 0x1ac0, 0x1ac0, 0x1ac0, 0x1a9d, 0x1a56, 0xc0fc, ++ 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1ac2, ++ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, ++ 0x19f3, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f7, 0x19f1, ++ 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19fb, 0x19f1, 0x19f1, 0x19f1, ++ 0x19f1, 0x19f1, 0x19ff, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f1, ++ 0x1a03, 0x080c, 0x0d84, 0xa774, 0xa678, 0x0804, 0x1ac2, 0xa78c, ++ 0xa690, 0x0804, 0x1ac2, 0xa7a4, 0xa6a8, 0x0804, 0x1ac2, 0xa7bc, ++ 0xa6c0, 0x0804, 0x1ac2, 0xa7d4, 0xa6d8, 0x0804, 0x1ac2, 0x2c05, ++ 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1a2a, ++ 0x1a2a, 0x1a2c, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a32, 0x1a2a, 0x1a2a, ++ 0x1a2a, 0x1a38, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a3e, 0x1a2a, 0x1a2a, ++ 0x1a2a, 0x1a44, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a4a, 0x1a2a, 0x1a2a, ++ 0x1a2a, 0x1a50, 0x080c, 0x0d84, 0xa574, 0xa478, 0xa37c, 0xa280, ++ 0x0804, 0x1ac2, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1ac2, ++ 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1ac2, 0xa5a4, 0xa4a8, ++ 0xa3ac, 0xa2b0, 0x0804, 0x1ac2, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, ++ 0x0804, 0x1ac2, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1ac2, ++ 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1ac2, 0x2c05, 0x908a, ++ 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1a79, 0x1a77, ++ 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a81, 0x1a77, 0x1a77, 0x1a77, ++ 0x1a77, 0x1a77, 0x1a88, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a77, ++ 0x1a8f, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a96, 0x080c, ++ 0x0d84, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0804, ++ 0x1ac2, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x04d0, ++ 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0498, 0xa5b4, ++ 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0460, 0xa5cc, 0xa4d0, ++ 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0428, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x001e, 0x11e8, 0x080c, 0x1c9b, 0x1904, 0x19a2, 0x900e, ++ 0x04a0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0048, 0x190c, 0x0d84, ++ 0x00c6, 0x7004, 0x2060, 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904, ++ 0x1a56, 0xab9c, 0x9016, 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0010, ++ 0x080c, 0x0d84, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, ++ 0x782b, 0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, ++ 0xa840, 0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, 0x9201, ++ 0x7012, 0x080c, 0x1c9b, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e, ++ 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0d84, 0x0026, 0x2001, ++ 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, 0x7004, ++ 0x2060, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0118, 0xa880, 0xc0bd, ++ 0xa882, 0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, ++ 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, ++ 0xa89a, 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xad1e, ++ 0x00ce, 0x2001, 0x19c3, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x080c, 0x901f, 0x2011, 0x0000, 0x080c, 0x8ea3, ++ 0x080c, 0x820b, 0x002e, 0x0804, 0x1c4d, 0x0126, 0x2091, 0x2400, ++ 0xa858, 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, ++ 0x1ae6, 0x7000, 0x0002, 0x1c4d, 0x1b37, 0x1ba0, 0x1c4b, 0x8001, ++ 0x7002, 0xd19c, 0x1150, 0x8aff, 0x0590, 0x080c, 0x199c, 0x0904, ++ 0x1c4d, 0x080c, 0x199c, 0x0804, 0x1c4d, 0x782b, 0x0004, 0xd194, ++ 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x11b8, 0xa87c, 0xc0f5, ++ 0xa87e, 0x0098, 0xab3c, 0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814, ++ 0xa832, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822, 0xab3e, 0xaa42, ++ 0x080c, 0x1cb3, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, ++ 0xa85a, 0x2c00, 0xa812, 0x7003, 0x0000, 0x0804, 0x1c4d, 0x00f6, ++ 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, ++ 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, ++ 0x8319, 0x090c, 0x0d84, 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, 0x0804, 0x1c4d, ++ 0x8001, 0x7002, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1b2a, ++ 0xd19c, 0x1904, 0x1c49, 0x8aff, 0x0904, 0x1c4d, 0x080c, 0x199c, ++ 0x0804, 0x1c4d, 0xab3c, 0xaa40, 0x080c, 0x1cb3, 0xdd9c, 0x1904, ++ 0x1c08, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, 0x001b, ++ 0x0002, 0x1bdc, 0x1bdc, 0x1bde, 0x1bdc, 0x1bdc, 0x1bdc, 0x1be4, ++ 0x1bdc, 0x1bdc, 0x1bdc, 0x1bea, 0x1bdc, 0x1bdc, 0x1bdc, 0x1bf0, ++ 0x1bdc, 0x1bdc, 0x1bdc, 0x1bf6, 0x1bdc, 0x1bdc, 0x1bdc, 0x1bfc, ++ 0x1bdc, 0x1bdc, 0x1bdc, 0x1c02, 0x080c, 0x0d84, 0xa07c, 0x931a, ++ 0xa080, 0x9213, 0x0804, 0x1b54, 0xa08c, 0x931a, 0xa090, 0x9213, ++ 0x0804, 0x1b54, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804, 0x1b54, ++ 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1b54, 0xa0bc, 0x931a, ++ 0xa0c0, 0x9213, 0x0804, 0x1b54, 0xa0cc, 0x931a, 0xa0d0, 0x9213, ++ 0x0804, 0x1b54, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1b54, ++ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, ++ 0x1c2b, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c31, 0x1c29, ++ 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c37, 0x1c29, 0x1c29, 0x1c29, ++ 0x1c29, 0x1c29, 0x1c3d, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c29, ++ 0x1c43, 0x080c, 0x0d84, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, ++ 0x1b54, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1b54, 0xa0ac, ++ 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1b54, 0xa0c4, 0x931a, 0xa0c8, ++ 0x9213, 0x0804, 0x1b54, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, ++ 0x1b54, 0x0804, 0x1b52, 0x080c, 0x0d84, 0x012e, 0x0005, 0x00f6, ++ 0x00e6, 0x2071, 0x1a33, 0x7000, 0x9086, 0x0000, 0x0904, 0x1c98, ++ 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, ++ 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xcd2b, 0x2001, ++ 0x0133, 0x2004, 0x9005, 0x090c, 0x0d84, 0x0016, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, ++ 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1b25, 0x7000, ++ 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, ++ 0x2009, 0x0040, 0x080c, 0x2014, 0x782b, 0x0002, 0x7003, 0x0000, ++ 0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, ++ 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, ++ 0x000f, 0x9080, 0x1cdd, 0x2065, 0x8cff, 0x090c, 0x0d84, 0x8a51, ++ 0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005, 0x1190, ++ 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, 0x2040, ++ 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1ced, 0x2065, 0x8cff, ++ 0x090c, 0x0d84, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, 0x0029, ++ 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, 0x002d, ++ 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1cd0, 0x1ccc, ++ 0x0000, 0x0000, 0x1cda, 0x0000, 0x1cd0, 0x1cd7, 0x1cd7, 0x1cd4, ++ 0x0000, 0x0000, 0x0000, 0x1cda, 0x1cd7, 0x0000, 0x1cd2, 0x1cd2, ++ 0x0000, 0x0000, 0x1cda, 0x0000, 0x1cd2, 0x1cd8, 0x1cd8, 0x1cd8, ++ 0x0000, 0x0000, 0x0000, 0x1cda, 0x1cd8, 0x00c6, 0x00d6, 0x0086, ++ 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1ed4, 0x2940, 0xa064, ++ 0x90ec, 0x000f, 0x9de0, 0x1cdd, 0x9d86, 0x0007, 0x0130, 0x9d86, ++ 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, ++ 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x1ed4, 0xa004, ++ 0x9045, 0x0904, 0x1ed4, 0x0c18, 0x2c05, 0x9005, 0x0904, 0x1dbc, ++ 0xdd9c, 0x1904, 0x1d78, 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, ++ 0x001b, 0x0002, 0x1d4d, 0x1d4d, 0x1d4f, 0x1d4d, 0x1d4d, 0x1d4d, ++ 0x1d55, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d5b, 0x1d4d, 0x1d4d, 0x1d4d, ++ 0x1d61, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d67, 0x1d4d, 0x1d4d, 0x1d4d, ++ 0x1d6d, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d73, 0x080c, 0x0d84, 0xa07c, ++ 0x9422, 0xa080, 0x931b, 0x0804, 0x1db2, 0xa08c, 0x9422, 0xa090, ++ 0x931b, 0x0804, 0x1db2, 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, ++ 0x1db2, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1db2, 0xa0bc, ++ 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1db2, 0xa0cc, 0x9422, 0xa0d0, ++ 0x931b, 0x0804, 0x1db2, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, ++ 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1d9a, ++ 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d9f, 0x1d98, 0x1d98, ++ 0x1d98, 0x1d98, 0x1d98, 0x1da4, 0x1d98, 0x1d98, 0x1d98, 0x1d98, ++ 0x1d98, 0x1da9, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1dae, ++ 0x080c, 0x0d84, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098, 0xa094, ++ 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b, ++ 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422, ++ 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, ++ 0x1ed4, 0x8c60, 0x0804, 0x1d24, 0xa004, 0x9045, 0x0904, 0x1ed4, ++ 0x0804, 0x1d07, 0x8a51, 0x0904, 0x1ed4, 0x8c60, 0x2c05, 0x9005, ++ 0x1158, 0xa004, 0x9045, 0x0904, 0x1ed4, 0xa064, 0x90ec, 0x000f, ++ 0x9de0, 0x1cdd, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, ++ 0x1ec9, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, ++ 0xab32, 0xdd9c, 0x1904, 0x1e66, 0x9082, 0x001b, 0x0002, 0x1e02, ++ 0x1e02, 0x1e04, 0x1e02, 0x1e02, 0x1e02, 0x1e12, 0x1e02, 0x1e02, ++ 0x1e02, 0x1e20, 0x1e02, 0x1e02, 0x1e02, 0x1e2e, 0x1e02, 0x1e02, ++ 0x1e02, 0x1e3c, 0x1e02, 0x1e02, 0x1e02, 0x1e4a, 0x1e02, 0x1e02, ++ 0x1e02, 0x1e58, 0x080c, 0x0d84, 0xa17c, 0x2400, 0x9122, 0xa180, ++ 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa074, 0x9420, 0xa078, 0x9319, ++ 0x0804, 0x1ec4, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, 0x911b, ++ 0x0a0c, 0x0d84, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, 0x1ec4, ++ 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d84, ++ 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1ec4, 0xa1ac, 0x2400, ++ 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa0a4, 0x9420, ++ 0xa0a8, 0x9319, 0x0804, 0x1ec4, 0xa1bc, 0x2400, 0x9122, 0xa1c0, ++ 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa0b4, 0x9420, 0xa0b8, 0x9319, ++ 0x0804, 0x1ec4, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, ++ 0x0a0c, 0x0d84, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, 0x1ec4, ++ 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d84, ++ 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1ec4, 0x9082, 0x001b, ++ 0x0002, 0x1e84, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e91, ++ 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e9e, 0x1e82, 0x1e82, ++ 0x1e82, 0x1e82, 0x1e82, 0x1eab, 0x1e82, 0x1e82, 0x1e82, 0x1e82, ++ 0x1e82, 0x1eb8, 0x080c, 0x0d84, 0xa17c, 0x2400, 0x9122, 0xa180, ++ 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa06c, 0x9420, 0xa070, 0x9319, ++ 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, ++ 0x0d84, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, ++ 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa09c, 0x9420, ++ 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, ++ 0x911b, 0x0a0c, 0x0d84, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, ++ 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d84, ++ 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd, ++ 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e, ++ 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce, 0x9085, ++ 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0x9084, 0x0007, 0x0002, ++ 0x1ef2, 0x1b25, 0x1ef2, 0x1ee8, 0x1eeb, 0x1eee, 0x1eeb, 0x1eee, ++ 0x080c, 0x1b25, 0x0005, 0x080c, 0x1146, 0x0005, 0x080c, 0x1b25, ++ 0x080c, 0x1146, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, ++ 0x2071, 0x0260, 0x2069, 0x1800, 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, 0x2011, ++ 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, ++ 0x0002, 0x1f39, 0x1f31, 0x71ab, 0x1f31, 0x1f33, 0x1f33, 0x1f33, ++ 0x1f33, 0x7191, 0x1f31, 0x1f35, 0x1f31, 0x1f33, 0x1f31, 0x1f33, ++ 0x1f31, 0x080c, 0x0d84, 0x0031, 0x0020, 0x080c, 0x7191, 0x080c, ++ 0x71ab, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xcd2b, 0x7930, ++ 0x9184, 0x0003, 0x01c0, 0x2001, 0x19c3, 0x2004, 0x9005, 0x0170, ++ 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d84, 0x00c6, 0x2001, ++ 0x19c3, 0x2064, 0x080c, 0xad1e, 0x00ce, 0x00f8, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, ++ 0x0003, 0x0160, 0x080c, 0x6877, 0x1138, 0x080c, 0x6b40, 0x080c, ++ 0x56d9, 0x080c, 0x67be, 0x0010, 0x080c, 0x55a0, 0x080c, 0x7243, ++ 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, ++ 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a30, 0x080c, ++ 0x1827, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, ++ 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x193e, 0x2102, 0x2001, ++ 0x1946, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, ++ 0x0201, 0x789e, 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, 0x0d84, 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, 0x1800, 0x2009, 0x0000, ++ 0x080c, 0x27f5, 0x080c, 0x2718, 0x6054, 0x8004, 0x8004, 0x8004, ++ 0x8004, 0x9084, 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, ++ 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x2009, 0x196a, ++ 0x2011, 0x196b, 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x275c, ++ 0x1238, 0x939d, 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, ++ 0x939d, 0x0203, 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, ++ 0x2747, 0x9006, 0x080c, 0x272a, 0x20a9, 0x0012, 0x1d04, 0x2066, ++ 0x2091, 0x6000, 0x1f04, 0x2066, 0x602f, 0x0100, 0x602f, 0x0000, ++ 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, ++ 0x080c, 0x2436, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2446, ++ 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, ++ 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x049f, 0x60bb, ++ 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x2093, 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, 0x1834, ++ 0x2003, 0x0000, 0x2001, 0x1833, 0x2003, 0x0001, 0x0005, 0x0126, ++ 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x9184, 0x5e2c, ++ 0x1118, 0x9184, 0x0007, 0x002a, 0x9195, 0x0004, 0x9284, 0x0007, ++ 0x0002, 0x20f3, 0x20d9, 0x20dc, 0x20df, 0x20e4, 0x20e6, 0x20ea, ++ 0x20ee, 0x080c, 0x7ab7, 0x00b8, 0x080c, 0x7b8a, 0x00a0, 0x080c, ++ 0x7b8a, 0x080c, 0x7ab7, 0x0078, 0x0099, 0x0068, 0x080c, 0x7ab7, ++ 0x0079, 0x0048, 0x080c, 0x7b8a, 0x0059, 0x0028, 0x080c, 0x7b8a, ++ 0x080c, 0x7ab7, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, ++ 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x232f, ++ 0xd1f4, 0x0110, 0x080c, 0x0d84, 0x080c, 0x6877, 0x05a0, 0x7000, ++ 0x9086, 0x0003, 0x01f0, 0x6024, 0x9084, 0x1800, 0x01d0, 0x080c, ++ 0x689a, 0x0118, 0x080c, 0x6888, 0x11a0, 0x6027, 0x0020, 0x6043, ++ 0x0000, 0x709c, 0x9005, 0x1150, 0x709f, 0x0001, 0x00d6, 0x2069, ++ 0x0140, 0x080c, 0x68d0, 0x00de, 0x1904, 0x2332, 0x080c, 0x6b4a, ++ 0x0428, 0x080c, 0x689a, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, ++ 0x0468, 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x080c, ++ 0x67be, 0x0804, 0x232f, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, ++ 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7090, 0x9086, ++ 0x0028, 0x1110, 0x080c, 0x6a2d, 0x0804, 0x232f, 0x080c, 0x6b45, ++ 0x0048, 0x2001, 0x194c, 0x2003, 0x0002, 0x0020, 0x080c, 0x69a3, ++ 0x0804, 0x232f, 0x080c, 0x6ac8, 0x0804, 0x232f, 0xd1ac, 0x0904, ++ 0x224f, 0x080c, 0x6877, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, ++ 0x0036, 0x080c, 0x6891, 0x1158, 0x080c, 0x6b40, 0x080c, 0x56d9, ++ 0x080c, 0x67be, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, ++ 0x002e, 0x000e, 0x080c, 0x6853, 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, 0x447f, 0x003e, 0x080c, ++ 0xb752, 0x1904, 0x222c, 0x9196, 0xff00, 0x05a8, 0x7058, 0x9084, ++ 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, ++ 0x1550, 0x080c, 0x2e69, 0x0128, 0xc18d, 0x7132, 0x080c, 0x5f25, ++ 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, ++ 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x222c, 0x7034, ++ 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x222c, ++ 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x447f, ++ 0x003e, 0x0804, 0x222c, 0x7034, 0xd08c, 0x1140, 0x2001, 0x180c, ++ 0x200c, 0xd1ac, 0x1904, 0x222c, 0xc1ad, 0x2102, 0x0036, 0x73d4, ++ 0x2011, 0x8013, 0x080c, 0x447f, 0x003e, 0x7130, 0xc185, 0x7132, ++ 0x2011, 0x1853, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, ++ 0x2011, 0x0100, 0x080c, 0x7a0a, 0x2019, 0x000e, 0x00c6, 0x2061, ++ 0x0000, 0x080c, 0xc941, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x2e6e, ++ 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, ++ 0x080c, 0xc9c5, 0x001e, 0xd1ac, 0x1140, 0x0016, 0x900e, 0x2019, ++ 0x0004, 0x080c, 0x2ce5, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, ++ 0x007f, 0x900e, 0x080c, 0x5c0d, 0x1110, 0x080c, 0x56f3, 0x8108, ++ 0x1f04, 0x2222, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x94da, ++ 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, ++ 0x1170, 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, ++ 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, ++ 0x0001, 0x2001, 0x1824, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, ++ 0x0904, 0x232f, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x22db, 0x080c, ++ 0x7893, 0x080c, 0x8b50, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19bd, ++ 0x2304, 0x907d, 0x0904, 0x22ac, 0x7804, 0x9086, 0x0032, 0x1904, ++ 0x22ac, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, 0x7814, ++ 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, ++ 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x2001, ++ 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2001, 0x001e, ++ 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x27d0, 0x6904, 0xd1dc, ++ 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x080c, 0x8026, 0x080c, 0x8125, 0x7814, 0x2048, 0xa867, ++ 0x0103, 0x2f60, 0x080c, 0x9554, 0x009e, 0x00ee, 0x00ce, 0x00de, ++ 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, ++ 0x6804, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x00de, 0x00c6, 0x2061, 0x19b4, 0x6028, ++ 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8b2c, ++ 0x0804, 0x232e, 0x2061, 0x0100, 0x62c0, 0x080c, 0x9367, 0x2019, ++ 0x19bd, 0x2304, 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0x95ce, ++ 0x00ce, 0x0804, 0x232e, 0xd2bc, 0x05f0, 0x080c, 0x78a0, 0x6014, ++ 0x9084, 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, ++ 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x00de, 0x00c6, 0x2061, ++ 0x19b4, 0x6044, 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c, ++ 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0, 0x080c, 0x7898, 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, 0x8dfe, 0x003e, 0x2019, 0x19c3, 0x2304, 0x9065, ++ 0x0120, 0x2009, 0x004f, 0x080c, 0x95ce, 0x00ce, 0x001e, 0xd19c, ++ 0x0904, 0x23a1, 0x7034, 0xd0ac, 0x1904, 0x2376, 0x0016, 0x0156, ++ 0x6027, 0x0008, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, ++ 0xfbcf, 0x6052, 0x080c, 0x27ef, 0x9085, 0x2000, 0x6052, 0x20a9, ++ 0x0012, 0x1d04, 0x2349, 0x080c, 0x78c7, 0x1f04, 0x2349, 0x6050, ++ 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, ++ 0x1f04, 0x2357, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, ++ 0x1d04, 0x2360, 0x080c, 0x78c7, 0x6020, 0xd09c, 0x1130, 0x015e, ++ 0x6152, 0x001e, 0x6027, 0x0008, 0x04a0, 0x080c, 0x27b7, 0x1f04, ++ 0x2360, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, ++ 0xc09c, 0x602a, 0x080c, 0x94da, 0x60e3, 0x0000, 0x080c, 0xcd0a, ++ 0x080c, 0xcd25, 0x080c, 0x4dee, 0xd0fc, 0x1138, 0x080c, 0xb752, ++ 0x1120, 0x9085, 0x0001, 0x080c, 0x68c0, 0x9006, 0x080c, 0x28a5, ++ 0x2009, 0x0002, 0x080c, 0x27f5, 0x00e6, 0x2071, 0x1800, 0x7003, ++ 0x0004, 0x080c, 0x0e3b, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b69, ++ 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016, ++ 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, ++ 0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904, 0x23f5, 0x81ff, 0x01a0, ++ 0x2009, 0x0000, 0x080c, 0x27f5, 0x2011, 0x8011, 0x2019, 0x010e, ++ 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, ++ 0x0000, 0x080c, 0x447f, 0x0448, 0x2001, 0x1975, 0x200c, 0x81ff, ++ 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, ++ 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x447f, 0x080c, 0x0e3b, ++ 0x080c, 0x4dee, 0xd0fc, 0x1188, 0x080c, 0xb752, 0x1170, 0x00c6, ++ 0x080c, 0x2491, 0x080c, 0x8d36, 0x2061, 0x0100, 0x2019, 0x0028, ++ 0x2009, 0x0002, 0x080c, 0x2ce5, 0x00ce, 0x012e, 0x00fe, 0x00ee, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, ++ 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, ++ 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181d, 0x2204, 0x9106, 0x1190, ++ 0x2011, 0x181e, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, ++ 0x1148, 0x2011, 0x181e, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, ++ 0x9206, 0x1120, 0x2500, 0x080c, 0x745f, 0x0048, 0x9584, 0x00ff, ++ 0x9080, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, ++ 0x9080, 0x2e6e, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, ++ 0x0140, 0x2001, 0x1816, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, ++ 0x6852, 0x6856, 0x1f04, 0x2441, 0x00de, 0x0005, 0x0006, 0x00d6, ++ 0x0026, 0x2069, 0x0140, 0x2001, 0x1816, 0x2102, 0x8114, 0x8214, ++ 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, ++ 0x1128, 0x9184, 0x000f, 0x9080, 0xd10f, 0x2005, 0x6856, 0x8211, ++ 0x1f04, 0x2456, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, ++ 0x1800, 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, ++ 0x2486, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, ++ 0x0005, 0x080c, 0x4dea, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, ++ 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xc9c5, 0x004e, 0x0005, ++ 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, ++ 0x24fd, 0x080c, 0x275c, 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, 0x7a4b, 0x928c, 0xff00, ++ 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, ++ 0x2009, 0x0138, 0x220a, 0x080c, 0x6877, 0x1118, 0x2009, 0x193c, ++ 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, ++ 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, ++ 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d84, ++ 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, 0x195d, ++ 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d84, 0x0033, 0x00ee, 0x002e, ++ 0x001e, 0x000e, 0x015e, 0x0005, 0x255b, 0x2579, 0x259d, 0x259f, ++ 0x25c8, 0x25ca, 0x25cc, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, ++ 0x27b2, 0x2001, 0x195f, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, ++ 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2770, 0x2001, 0x195d, ++ 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25cd, 0x080c, 0x78a5, ++ 0x0005, 0x2009, 0x1962, 0x200b, 0x0000, 0x2001, 0x1967, 0x2003, ++ 0x0036, 0x2001, 0x1966, 0x2003, 0x002a, 0x2001, 0x195f, 0x2003, ++ 0x0001, 0x9006, 0x080c, 0x272a, 0x2001, 0xffff, 0x20a9, 0x0009, ++ 0x080c, 0x2770, 0x2001, 0x195d, 0x2003, 0x0006, 0x2009, 0x001e, ++ 0x2011, 0x25cd, 0x080c, 0x78a5, 0x0005, 0x080c, 0x0d84, 0x2001, ++ 0x1967, 0x2003, 0x0036, 0x2001, 0x195f, 0x2003, 0x0003, 0x7a38, ++ 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, ++ 0x0001, 0x080c, 0x272a, 0x2001, 0x1963, 0x2003, 0x0000, 0x2001, ++ 0xffff, 0x20a9, 0x0009, 0x080c, 0x2770, 0x2001, 0x195d, 0x2003, ++ 0x0006, 0x2009, 0x001e, 0x2011, 0x25cd, 0x080c, 0x78a5, 0x0005, ++ 0x080c, 0x0d84, 0x080c, 0x0d84, 0x0005, 0x0006, 0x0016, 0x0026, ++ 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, ++ 0x2001, 0x195f, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d84, 0x0043, ++ 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, ++ 0x25ef, 0x260f, 0x264f, 0x267f, 0x26a3, 0x26b3, 0x26b5, 0x080c, ++ 0x2764, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1965, ++ 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, ++ 0x0008, 0xc085, 0x200a, 0x2001, 0x195d, 0x2003, 0x0001, 0x0030, ++ 0x080c, 0x26d9, 0x2001, 0xffff, 0x080c, 0x256a, 0x0005, 0x080c, ++ 0x26b7, 0x05e0, 0x2009, 0x1966, 0x2104, 0x8001, 0x200a, 0x080c, ++ 0x2764, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, ++ 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1965, 0x2104, 0xc085, ++ 0x200a, 0x2009, 0x1962, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, ++ 0x0118, 0x080c, 0x26bf, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, ++ 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, ++ 0x080c, 0x2747, 0x2001, 0x195f, 0x2003, 0x0002, 0x0028, 0x2001, ++ 0x195d, 0x2003, 0x0003, 0x0010, 0x080c, 0x258c, 0x0005, 0x080c, ++ 0x26b7, 0x0560, 0x2009, 0x1966, 0x2104, 0x8001, 0x200a, 0x080c, ++ 0x2764, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x195d, ++ 0x2003, 0x0003, 0x2001, 0x195e, 0x2003, 0x0000, 0x00b8, 0x2009, ++ 0x1966, 0x2104, 0x9005, 0x1118, 0x080c, 0x26fc, 0x0010, 0x080c, ++ 0x26cc, 0x080c, 0x26bf, 0x2009, 0x1962, 0x200b, 0x0000, 0x2001, ++ 0x195f, 0x2003, 0x0001, 0x080c, 0x258c, 0x0000, 0x0005, 0x04b9, ++ 0x0508, 0x080c, 0x2764, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, ++ 0x2009, 0x1963, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, ++ 0x0078, 0x2001, 0x1968, 0x2003, 0x000a, 0x2009, 0x1965, 0x2104, ++ 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x195f, 0x2003, 0x0004, ++ 0x080c, 0x25b7, 0x0005, 0x0099, 0x0168, 0x080c, 0x2764, 0x1138, ++ 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x25a3, 0x0018, 0x0079, ++ 0x080c, 0x25b7, 0x0005, 0x080c, 0x0d84, 0x080c, 0x0d84, 0x2009, ++ 0x1967, 0x2104, 0x8001, 0x200a, 0x090c, 0x2718, 0x0005, 0x7a38, ++ 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, ++ 0x0001, 0x080c, 0x2747, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, ++ 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x272a, ++ 0x0005, 0x2009, 0x1962, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, ++ 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, ++ 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38, ++ 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, ++ 0x0001, 0x080c, 0x2747, 0x0005, 0x0086, 0x2001, 0x1965, 0x2004, ++ 0x9084, 0x7fff, 0x090c, 0x0d84, 0x2009, 0x1964, 0x2144, 0x8846, ++ 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, ++ 0x0d84, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, ++ 0x0006, 0x0156, 0x2001, 0x195d, 0x20a9, 0x0009, 0x2003, 0x0000, ++ 0x8000, 0x1f04, 0x271e, 0x2001, 0x1964, 0x2003, 0x8000, 0x015e, ++ 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, ++ 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196a, ++ 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, ++ 0x783a, 0x2009, 0x196b, 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, 0x27ef, 0xd09c, 0x1110, 0x1f04, 0x2767, 0x015e, 0x0005, ++ 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, 0x0040, ++ 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x27ef, 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, 0x279d, 0x080c, ++ 0x78c7, 0x1f04, 0x279d, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, ++ 0x7852, 0x080c, 0x27ef, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, ++ 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, 0x7852, 0x0005, 0x0006, ++ 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, ++ 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x27c1, 0x0028, 0x7854, ++ 0xd08c, 0x1110, 0x1f04, 0x27c7, 0x00fe, 0x015e, 0x000e, 0x0005, ++ 0x1d04, 0x27d0, 0x080c, 0x78c7, 0x1f04, 0x27d0, 0x0005, 0x0006, ++ 0x2001, 0x1969, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, ++ 0x2001, 0x1969, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, ++ 0x2001, 0x1969, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, ++ 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1975, ++ 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, 0x1580, 0x2009, 0x017f, ++ 0x200b, 0x00a2, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, 0x2009, ++ 0x0169, 0x2104, 0xa001, 0x210c, 0x910e, 0x1dc8, 0x9084, 0x0007, ++ 0x9086, 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, 0x1d68, 0x8211, ++ 0x1d70, 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, ++ 0x9186, 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, 0xc0dd, 0x200a, ++ 0x0008, 0x0419, 0x2001, 0x017f, 0x2003, 0x0000, 0x004e, 0x003e, ++ 0x0005, 0x2001, 0x180c, 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, 0x180c, ++ 0x200c, 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x2009, ++ 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, ++ 0x0005, 0x2b1d, 0x2b1d, 0x2941, 0x2941, 0x294d, 0x294d, 0x2959, ++ 0x2959, 0x2967, 0x2967, 0x2973, 0x2973, 0x2981, 0x2981, 0x298f, ++ 0x298f, 0x29a1, 0x29a1, 0x29ad, 0x29ad, 0x29bb, 0x29bb, 0x29d9, ++ 0x29d9, 0x29f9, 0x29f9, 0x29c9, 0x29c9, 0x29e9, 0x29e9, 0x2a07, ++ 0x2a07, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x2a19, 0x2a19, 0x2a25, 0x2a25, 0x2a33, 0x2a33, 0x2a41, ++ 0x2a41, 0x2a51, 0x2a51, 0x2a5f, 0x2a5f, 0x2a6f, 0x2a6f, 0x2a7f, ++ 0x2a7f, 0x2a91, 0x2a91, 0x2a9f, 0x2a9f, 0x2aaf, 0x2aaf, 0x2ad1, ++ 0x2ad1, 0x2af3, 0x2af3, 0x2abf, 0x2abf, 0x2ae2, 0x2ae2, 0x2b02, ++ 0x2b02, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x20bf, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, ++ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eda, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x1f12, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x1eda, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, 0x2b15, 0xa001, ++ 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, ++ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20bf, 0x080c, ++ 0x129f, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x1eda, 0x080c, 0x129f, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, 0x129f, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x1eda, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, ++ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, ++ 0x20bf, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x1eda, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x20bf, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x1eda, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, ++ 0x129f, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, ++ 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x129f, ++ 0x080c, 0x1f12, 0x0410, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x129f, 0x080c, ++ 0x1f12, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, ++ 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, ++ 0x080c, 0x129f, 0x080c, 0x1f12, 0x0000, 0x015e, 0x014e, 0x013e, ++ 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, ++ 0x0026, 0x0046, 0x9026, 0x080c, 0x5eeb, 0x1904, 0x2c03, 0x72d8, ++ 0x2001, 0x194b, 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, ++ 0x1138, 0xd2bc, 0x1904, 0x2c03, 0x080c, 0x2c08, 0x0804, 0x2c03, ++ 0xd2cc, 0x1904, 0x2c03, 0x080c, 0x6877, 0x1120, 0x70a7, 0xffff, ++ 0x0804, 0x2c03, 0xd294, 0x0120, 0x70a7, 0xffff, 0x0804, 0x2c03, ++ 0x080c, 0x2e64, 0x0140, 0x080c, 0xb759, 0x1904, 0x2ba4, 0x70a7, ++ 0xffff, 0x0804, 0x2c03, 0x2001, 0x1816, 0x203c, 0x728c, 0xd284, ++ 0x0904, 0x2ba4, 0xd28c, 0x1904, 0x2ba4, 0x0036, 0x73a4, 0x938e, ++ 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, ++ 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, ++ 0x00ff, 0x970e, 0x0540, 0x908e, 0x0000, 0x0528, 0x908e, 0x00ff, ++ 0x1150, 0x7230, 0xd284, 0x1518, 0x728c, 0xc28d, 0x728e, 0x70a7, ++ 0xffff, 0x003e, 0x0408, 0x900e, 0x080c, 0x23fd, 0x080c, 0x5bb0, ++ 0x11a0, 0x080c, 0x5f2d, 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, ++ 0xd0bc, 0x0120, 0x080c, 0x2c1f, 0x0140, 0x0028, 0x080c, 0x2d5b, ++ 0x080c, 0x2c4b, 0x0110, 0x8318, 0x0838, 0x73a6, 0x0010, 0x70a7, ++ 0xffff, 0x003e, 0x0804, 0x2c03, 0x9780, 0x2e6e, 0x203d, 0x97bc, ++ 0xff00, 0x873f, 0x2041, 0x007e, 0x70a4, 0x9096, 0xffff, 0x1118, ++ 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, ++ 0x0020, 0x70a7, 0xffff, 0x0804, 0x2c03, 0x2700, 0x0156, 0x0016, ++ 0x9106, 0x05b0, 0xc484, 0x080c, 0x5c0d, 0x0138, 0x080c, 0xb759, ++ 0x1578, 0x080c, 0x5bb0, 0x15a0, 0x0008, 0xc485, 0x080c, 0x5f2d, ++ 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x728c, ++ 0xd28c, 0x0180, 0x080c, 0x5f2d, 0x9082, 0x0006, 0x02c8, 0xd484, ++ 0x1118, 0x080c, 0x5bd1, 0x0028, 0x080c, 0x2de6, 0x0188, 0x080c, ++ 0x2e11, 0x0070, 0x080c, 0x2d5b, 0x080c, 0xb759, 0x1148, 0x080c, ++ 0x2c4b, 0x0170, 0x0028, 0x080c, 0x2de6, 0x0110, 0x0441, 0x0140, ++ 0x001e, 0x8108, 0x015e, 0x1f04, 0x2bbd, 0x70a7, 0xffff, 0x0018, ++ 0x001e, 0x015e, 0x71a6, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005, ++ 0x00c6, 0x0016, 0x70a7, 0x0001, 0x2009, 0x007e, 0x080c, 0x5bb0, ++ 0x1158, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x2d5b, 0x0499, ++ 0x0118, 0x70d8, 0xc0bd, 0x70da, 0x001e, 0x00ce, 0x0005, 0x0016, ++ 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1857, 0x2004, 0x9084, 0x00ff, ++ 0xb842, 0x080c, 0x95a1, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xb4e6, ++ 0x6023, 0x0001, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0000, 0x080c, ++ 0x5b61, 0x0126, 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, 0x012e, ++ 0x2009, 0x0004, 0x080c, 0x95ce, 0x9085, 0x0001, 0x00ce, 0x00de, ++ 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, ++ 0x1857, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x95a1, 0x0548, ++ 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, ++ 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, ++ 0x2d1a, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x9006, 0x080c, 0x5b4d, ++ 0x2001, 0x0002, 0x080c, 0x5b61, 0x0126, 0x2091, 0x8000, 0x70a0, ++ 0x8000, 0x70a2, 0x012e, 0x2009, 0x0002, 0x080c, 0x95ce, 0x9085, ++ 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, ++ 0x0026, 0x2009, 0x0080, 0x080c, 0x5bb0, 0x1140, 0xb813, 0x00ff, ++ 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, ++ 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0x94fe, ++ 0x01d0, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x9006, ++ 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, 0x0126, 0x2091, ++ 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, ++ 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, ++ 0x5bb0, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, ++ 0x080c, 0x94fe, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, ++ 0x620a, 0x080c, 0xb4e6, 0x2009, 0x0022, 0x080c, 0x95ce, 0x9085, ++ 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, ++ 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, 0x7d60, 0x080c, 0x7cef, ++ 0x080c, 0x93ac, 0x080c, 0xa3ab, 0x3e08, 0x2130, 0x81ff, 0x0120, ++ 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, ++ 0x080c, 0x5c0d, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, ++ 0x1110, 0x080c, 0x56f3, 0x001e, 0x8108, 0x1f04, 0x2cff, 0x86ff, ++ 0x1110, 0x080c, 0x2e3e, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, ++ 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, ++ 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7d55, ++ 0x0076, 0x2039, 0x0000, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, ++ 0x007e, 0x001e, 0xba10, 0xbb14, 0x080c, 0x56f3, 0xba12, 0xbb16, ++ 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, ++ 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, ++ 0x0150, 0x2071, 0x1800, 0x70a0, 0x9005, 0x0110, 0x8001, 0x70a2, ++ 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, ++ 0x8001, 0x70e2, 0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, ++ 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, ++ 0x1118, 0x20a9, 0x0001, 0x0088, 0x080c, 0x4dea, 0xd0c4, 0x0150, ++ 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, ++ 0xc9c5, 0x004e, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, ++ 0x0904, 0x2dc7, 0x928e, 0x007f, 0x0904, 0x2dc7, 0x928e, 0x0080, ++ 0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1148, ++ 0x2001, 0x195b, 0x0006, 0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, ++ 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x5ef7, ++ 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0x7c4d, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, ++ 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, ++ 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, ++ 0x0016, 0x2c08, 0x080c, 0xc73e, 0x001e, 0x007e, 0x2160, 0x002e, ++ 0x8210, 0x1f04, 0x2d7d, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce, ++ 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x4dea, ++ 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, ++ 0x080c, 0xc9c5, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, ++ 0x0036, 0x00c6, 0x728c, 0x82ff, 0x01e8, 0x080c, 0x5f25, 0x11d0, ++ 0x2100, 0x080c, 0x2430, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, ++ 0x92e0, 0x1c80, 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, 0x0036, 0x2019, ++ 0x0029, 0x00a9, 0x003e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, ++ 0x0016, 0x00c6, 0x2061, 0x1a72, 0x001e, 0x6112, 0x080c, 0x2d1a, ++ 0x001e, 0x080c, 0x5bd1, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, ++ 0x0026, 0x2110, 0x080c, 0x905b, 0x080c, 0xcc7a, 0x002e, 0x001e, ++ 0x0005, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x080c, ++ 0x6877, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, ++ 0x6877, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, ++ 0x2004, 0x9065, 0x0110, 0x080c, 0x5bd1, 0x8108, 0x1f04, 0x2e4e, ++ 0x2061, 0x1800, 0x6077, 0x0000, 0x6078, 0x9084, 0x00ff, 0x607a, ++ 0x60ab, 0x0000, 0x00ce, 0x0005, 0x2001, 0x1874, 0x2004, 0xd0bc, ++ 0x0005, 0x2011, 0x1853, 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, 0x1893, ++ 0x7003, 0x0002, 0x9006, 0x7012, 0x7016, 0x7046, 0x704a, 0x7037, ++ 0x18ae, 0x703b, 0x18ae, 0x7007, 0x0001, 0x080c, 0x0fc7, 0x090c, ++ 0x0d84, 0x2900, 0x7066, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, ++ 0x0fc7, 0x090c, 0x0d84, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, ++ 0xdcb0, 0x0005, 0x2071, 0x1893, 0x7004, 0x0002, 0x2f9a, 0x2f9b, ++ 0x2fa3, 0x2fb7, 0x0005, 0x1004, 0x2fa2, 0x0e04, 0x2fa2, 0x2079, ++ 0x0000, 0x0458, 0x0005, 0x2079, 0x0000, 0x2061, 0x18ac, 0x2c4c, ++ 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x3089, ++ 0x0005, 0x7014, 0x2048, 0x2061, 0x1800, 0x7018, 0x0807, 0x7010, ++ 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, ++ 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, ++ 0x0000, 0x2061, 0x1800, 0x7018, 0x0807, 0x2061, 0x1800, 0x7880, ++ 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a, 0x003f, ++ 0x1a04, 0x3086, 0x61cc, 0x0804, 0x301d, 0x305f, 0x3095, 0x309f, ++ 0x30a3, 0x30ad, 0x30b3, 0x30b7, 0x30c7, 0x30ca, 0x30d4, 0x30d9, ++ 0x30de, 0x30e9, 0x30f4, 0x3103, 0x3112, 0x3120, 0x3137, 0x3152, ++ 0x31f2, 0x31f7, 0x3235, 0x32dd, 0x32ee, 0x3311, 0x3086, 0x3086, ++ 0x3086, 0x3349, 0x3367, 0x3370, 0x339f, 0x33a5, 0x3086, 0x33dd, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x33e8, 0x33f1, 0x33f9, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x33fb, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3418, 0x3475, 0x3086, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x0002, 0x349f, 0x34a2, ++ 0x3502, 0x351b, 0x354b, 0x37ed, 0x3086, 0x49c6, 0x3086, 0x3086, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x30d4, 0x30d9, ++ 0x3cbf, 0x3086, 0x3cd6, 0x4a55, 0x4aa5, 0x4ba8, 0x3086, 0x4c0a, ++ 0x4c46, 0x4c77, 0x4d79, 0x4ca4, 0x4cfb, 0x3086, 0x3cda, 0x3ea6, ++ 0x3ebc, 0x3ed8, 0x3f3d, 0x3fb1, 0x3fd1, 0x403b, 0x404c, 0x405d, ++ 0x4060, 0x4085, 0x40f9, 0x415b, 0x4163, 0x428b, 0x43b4, 0x43dd, ++ 0x4504, 0x4522, 0x452e, 0x45d0, 0x46a0, 0x3086, 0x3086, 0x3086, ++ 0x3086, 0x4706, 0x4721, 0x48ac, 0x4982, 0x7148, 0x0000, 0x2021, ++ 0x4000, 0x080c, 0x445b, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3069, ++ 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, ++ 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, ++ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, ++ 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, 0x4468, 0x7883, ++ 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, ++ 0x7a8c, 0x7884, 0x7990, 0x0804, 0x446b, 0x7984, 0x7888, 0x2114, ++ 0x200a, 0x0804, 0x305f, 0x7984, 0x2114, 0x0804, 0x305f, 0x20e1, ++ 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, ++ 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x305f, 0x7884, ++ 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x000a, ++ 0x789b, 0x0117, 0x0804, 0x305f, 0x2039, 0x0001, 0x7d98, 0x7c9c, ++ 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, ++ 0x0040, 0x0210, 0x0804, 0x3092, 0x2138, 0x7d98, 0x7c9c, 0x0804, ++ 0x3099, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3092, 0x2138, ++ 0x7d98, 0x7c9c, 0x0804, 0x30a7, 0x79a0, 0x9182, 0x0040, 0x0210, ++ 0x0804, 0x3092, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, ++ 0x4004, 0x0804, 0x305f, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, ++ 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x305f, ++ 0x0804, 0x308c, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3092, ++ 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x305f, ++ 0x2069, 0x1852, 0x7884, 0x7990, 0x911a, 0x1a04, 0x3092, 0x8019, ++ 0x0904, 0x3092, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, ++ 0x9006, 0x685a, 0x685e, 0x080c, 0x6b71, 0x0804, 0x305f, 0x2069, ++ 0x1852, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3092, 0x8019, 0x0904, ++ 0x3092, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, ++ 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x5f97, 0x012e, ++ 0x0804, 0x305f, 0x902e, 0x2520, 0x81ff, 0x1904, 0x308f, 0x7984, ++ 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189a, ++ 0x4101, 0x080c, 0x441f, 0x0904, 0x308f, 0x2009, 0x0020, 0xa85c, ++ 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, 0x701b, 0x3170, 0x0005, ++ 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, ++ 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, ++ 0x9096, 0x0029, 0x1904, 0x308f, 0x810f, 0x918c, 0x00ff, 0x0904, ++ 0x308f, 0x710e, 0x700c, 0x8001, 0x0548, 0x700e, 0x080c, 0x441f, ++ 0x0904, 0x308f, 0x2009, 0x0020, 0x7064, 0x2040, 0xa28c, 0xa390, ++ 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, ++ 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, ++ 0x701b, 0x31ab, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, ++ 0x0120, 0x9096, 0x000a, 0x1904, 0x308f, 0x08a0, 0x7010, 0x2048, ++ 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, ++ 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x57e4, 0x0150, 0x0126, 0x2091, ++ 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x5ac6, 0x1128, ++ 0x7007, 0x0003, 0x701b, 0x31d7, 0x0005, 0x080c, 0x63d1, 0x0126, ++ 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x189a, ++ 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, ++ 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, ++ 0x0804, 0x446b, 0x61b4, 0x7884, 0x60b6, 0x0804, 0x305f, 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, 0x19e7, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, ++ 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, ++ 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x308f, ++ 0x7984, 0x080c, 0x5c0d, 0x1904, 0x3092, 0x7e98, 0x9684, 0x3fff, ++ 0x9082, 0x4000, 0x0210, 0x0804, 0x3092, 0x7c88, 0x7d8c, 0x080c, ++ 0x5d70, 0x080c, 0x5d3f, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, ++ 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, ++ 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, ++ 0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a04, 0x308f, ++ 0x0c30, 0x080c, 0xad1e, 0x012e, 0x0904, 0x308f, 0x0804, 0x305f, ++ 0x900e, 0x2001, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0xb37a, 0x080c, 0x61a9, 0x012e, 0x0804, 0x305f, 0x00a6, ++ 0x2950, 0xb198, 0x080c, 0x5c0d, 0x1904, 0x32ca, 0xb6a4, 0x9684, ++ 0x3fff, 0x9082, 0x4000, 0x0208, 0x04e8, 0xb49c, 0xb5a0, 0x080c, ++ 0x5d70, 0x080c, 0x5d3f, 0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091, ++ 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, ++ 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, ++ 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, ++ 0x0c28, 0x080c, 0xad1e, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, ++ 0x900e, 0x2001, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0xb37a, 0x080c, 0x61a9, 0x012e, 0x0070, 0xb097, 0x4005, ++ 0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, ++ 0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, ++ 0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x308f, ++ 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, ++ 0x080c, 0x5d76, 0x0904, 0x308f, 0x0804, 0x3fc8, 0x81ff, 0x1904, ++ 0x308f, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x5e04, 0x0904, ++ 0x308f, 0x2019, 0x0005, 0x79a8, 0x080c, 0x5d91, 0x0904, 0x308f, ++ 0x7888, 0x908a, 0x1000, 0x1a04, 0x3092, 0x8003, 0x800b, 0x810b, ++ 0x9108, 0x080c, 0x7826, 0x7984, 0xd184, 0x1904, 0x305f, 0x0804, ++ 0x3fc8, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, ++ 0x0450, 0x2029, 0x07ff, 0x6454, 0x2400, 0x9506, 0x01f8, 0x2508, ++ 0x080c, 0x5c0d, 0x11d8, 0x080c, 0x5e04, 0x1128, 0x2009, 0x0002, ++ 0x62bc, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x5d91, ++ 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, ++ 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7826, 0x8529, 0x1ae0, ++ 0x012e, 0x0804, 0x305f, 0x012e, 0x0804, 0x308f, 0x012e, 0x0804, ++ 0x3092, 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, ++ 0x308f, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x2061, 0x0000, 0x080c, ++ 0x7d55, 0x0076, 0x2039, 0x0000, 0x080c, 0x7c4d, 0x900e, 0x080c, ++ 0xc73e, 0x007e, 0x00ce, 0x080c, 0x5d70, 0x0804, 0x305f, 0x080c, ++ 0x4436, 0x0904, 0x3092, 0x080c, 0x5d70, 0x2208, 0x0804, 0x305f, ++ 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1904, 0x6810, 0x6914, 0x910a, ++ 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069, ++ 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68, ++ 0x1f04, 0x3381, 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804, ++ 0x305f, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, ++ 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, ++ 0x1904, 0x6910, 0x62b8, 0x0804, 0x305f, 0x81ff, 0x1904, 0x308f, ++ 0x6154, 0x9190, 0x2e6e, 0x2215, 0x9294, 0x00ff, 0x6374, 0x83ff, ++ 0x0108, 0x6278, 0x67d8, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, ++ 0x2031, 0x0001, 0x00f0, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, ++ 0x2031, 0x0003, 0x00b0, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, ++ 0x2031, 0x0002, 0x0070, 0x080c, 0x6877, 0x1118, 0x2031, 0x0004, ++ 0x0040, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x308f, 0x2031, ++ 0x0000, 0x7e9a, 0x7f9e, 0x0804, 0x305f, 0x6144, 0x6248, 0x2019, ++ 0x1953, 0x231c, 0x2001, 0x1954, 0x2004, 0x789a, 0x0804, 0x305f, ++ 0x0126, 0x2091, 0x8000, 0x6134, 0x6238, 0x633c, 0x012e, 0x0804, ++ 0x305f, 0x080c, 0x4452, 0x0904, 0x3092, 0xba44, 0xbb38, 0x0804, ++ 0x305f, 0x080c, 0x0d84, 0x6144, 0x6248, 0x7884, 0x6046, 0x7b88, ++ 0x634a, 0x2069, 0x1852, 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, ++ 0x1953, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, ++ 0x07d0, 0x2069, 0x1954, 0x2d04, 0x266a, 0x789a, 0x0804, 0x305f, ++ 0x0126, 0x2091, 0x8000, 0x6134, 0x7884, 0x6036, 0x910e, 0xd1b4, ++ 0x190c, 0x0e56, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196a, ++ 0x200a, 0x78ac, 0x2011, 0x196b, 0x2012, 0x2069, 0x0100, 0x6838, ++ 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, ++ 0x00de, 0x7884, 0x7888, 0x603a, 0x2011, 0x0114, 0x220c, 0x7888, ++ 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, ++ 0x613c, 0x788c, 0x603e, 0x910e, 0xd1e4, 0x190c, 0x0e73, 0x603c, ++ 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, ++ 0x305f, 0x00f6, 0x2079, 0x1800, 0x7a34, 0xa898, 0x9084, 0xfebf, ++ 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x79ec, 0x7834, ++ 0x9084, 0x0140, 0x9215, 0x7a36, 0xa897, 0x4000, 0x900e, 0x9085, ++ 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, ++ 0x7888, 0x9025, 0x0904, 0x3092, 0x788c, 0x902d, 0x0904, 0x3092, ++ 0x900e, 0x080c, 0x5c0d, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, ++ 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x4452, 0x0904, ++ 0x3092, 0x7888, 0x900d, 0x0904, 0x3092, 0x788c, 0x9005, 0x0904, ++ 0x3092, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x305f, 0x2011, ++ 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x4dfe, 0x1904, 0x308f, ++ 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, ++ 0x1816, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e8, ++ 0x9188, 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1816, 0x2004, ++ 0x0026, 0x9116, 0x002e, 0x0588, 0x810f, 0x9105, 0x0126, 0x2091, ++ 0x8000, 0x0006, 0x080c, 0x94fe, 0x000e, 0x0518, 0x6016, 0x600b, ++ 0xbc05, 0x7984, 0x00b6, 0x080c, 0x5bb0, 0x2b08, 0x00be, 0x1500, ++ 0x6112, 0x6023, 0x0001, 0x080c, 0x441f, 0x01d0, 0x9006, 0xa866, ++ 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701b, 0x34fb, ++ 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x95ce, 0x012e, 0x00ce, ++ 0x0005, 0x012e, 0x00ce, 0x0804, 0x308f, 0x00ce, 0x0804, 0x3092, ++ 0x080c, 0x9554, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x308f, ++ 0x0804, 0x305f, 0x2061, 0x1a3d, 0x0126, 0x2091, 0x8000, 0x6000, ++ 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x634c, 0x606c, ++ 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x305f, ++ 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, ++ 0x0904, 0x308f, 0x0126, 0x2091, 0x8000, 0x624c, 0x606c, 0x9202, ++ 0x0248, 0x9085, 0x0001, 0x080c, 0x2466, 0x080c, 0x4fc7, 0x012e, ++ 0x0804, 0x305f, 0x012e, 0x0804, 0x3092, 0x0006, 0x0016, 0x00c6, ++ 0x00e6, 0x2001, 0x1976, 0x2070, 0x2061, 0x1852, 0x6008, 0x2072, ++ 0x900e, 0x2011, 0x1400, 0x080c, 0x7a4b, 0x7206, 0x00ee, 0x00ce, ++ 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, ++ 0x012e, 0x2021, 0x400b, 0x0804, 0x3061, 0x7884, 0xd0fc, 0x0148, ++ 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x02a8, 0x012e, 0x0804, ++ 0x3092, 0x2001, 0x002a, 0x2004, 0x2069, 0x1852, 0x6908, 0x9102, ++ 0x1218, 0x012e, 0x0804, 0x3092, 0x614c, 0x606c, 0x9106, 0x0118, ++ 0x012e, 0x0804, 0x308f, 0x080c, 0x94d3, 0x0dd0, 0x7884, 0xd0fc, ++ 0x0904, 0x35ca, 0x00c6, 0x080c, 0x441f, 0x00ce, 0x0d88, 0xa867, ++ 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, ++ 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, ++ 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, ++ 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, ++ 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, ++ 0x080c, 0x3750, 0x0928, 0x7010, 0x2048, 0xad2c, 0xac28, 0xab1c, ++ 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, ++ 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, ++ 0x9080, 0x001b, 0x080c, 0x4468, 0x701b, 0x368d, 0x701f, 0x0001, ++ 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, ++ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3535, 0x2001, 0x196c, 0x2003, ++ 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, ++ 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x37bf, 0x080c, ++ 0x377e, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a33, 0x2079, ++ 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, ++ 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, ++ 0x2011, 0x0001, 0x080c, 0x3b2b, 0x008e, 0x00ee, 0x00fe, 0x080c, ++ 0x3a61, 0x080c, 0x396a, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, ++ 0x0140, 0x1db8, 0x080c, 0x3b7f, 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, 0x181e, ++ 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, ++ 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3974, 0x080c, 0x3779, 0x0058, ++ 0x080c, 0x3779, 0x080c, 0x3ac3, 0x080c, 0x3a57, 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, 0x1245, 0x2009, ++ 0x0028, 0x080c, 0x2014, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, ++ 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, ++ 0x2001, 0x196c, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x305f, ++ 0x012e, 0x2021, 0x400c, 0x0804, 0x3061, 0x0016, 0x0026, 0x0036, ++ 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7010, ++ 0x2048, 0x701c, 0x20a8, 0x8000, 0x701e, 0xa804, 0x9005, 0x0904, ++ 0x36e9, 0x2048, 0x1f04, 0x369d, 0x7064, 0x2040, 0xa28c, 0xa390, ++ 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, ++ 0x2021, 0x0000, 0x0096, 0x7010, 0x2048, 0xa864, 0x009e, 0x9086, ++ 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, ++ 0xffc0, 0x9080, 0x001b, 0x080c, 0x4468, 0x701b, 0x368d, 0x00b0, ++ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, ++ 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, ++ 0x0f2b, 0x000e, 0x080c, 0x446b, 0x701b, 0x368d, 0x015e, 0x00de, ++ 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, ++ 0x0005, 0x7010, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701b, ++ 0x374e, 0x0450, 0x7010, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, ++ 0x007f, 0x080c, 0x5bb0, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, ++ 0xb817, 0xfffd, 0x080c, 0xb535, 0x015e, 0x00de, 0x009e, 0x008e, ++ 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x308f, ++ 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, ++ 0x00d6, 0x0156, 0x701b, 0x3720, 0x7007, 0x0003, 0x0804, 0x36de, ++ 0x0076, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3061, ++ 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, ++ 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, ++ 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, ++ 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f2b, 0x000e, 0x080c, 0x446b, ++ 0x007e, 0x701b, 0x368d, 0x701f, 0x0001, 0x0005, 0x0804, 0x305f, ++ 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, ++ 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x441f, ++ 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, ++ 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, ++ 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, ++ 0x0005, 0x2001, 0x196c, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, ++ 0x00c6, 0x2061, 0x0200, 0x2001, 0x1977, 0x2004, 0x601a, 0x2061, ++ 0x0100, 0x2001, 0x1976, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, ++ 0x080c, 0x441f, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, ++ 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, ++ 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x1976, 0x2004, 0x6036, ++ 0x2009, 0x0040, 0x080c, 0x2014, 0x2001, 0x002a, 0x2004, 0x9084, ++ 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, ++ 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, ++ 0x080c, 0x441f, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, ++ 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, ++ 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, ++ 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, 0x27e7, 0x1130, 0x9006, 0x080c, 0x2747, ++ 0x9006, 0x080c, 0x272a, 0x7884, 0x9084, 0x0007, 0x0002, 0x380a, ++ 0x3813, 0x381c, 0x3807, 0x3807, 0x3807, 0x3807, 0x3807, 0x012e, ++ 0x0804, 0x3092, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, ++ 0x080c, 0x39ba, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, ++ 0x200a, 0x080c, 0x39ba, 0x0078, 0x080c, 0x6877, 0x1128, 0x012e, ++ 0x2009, 0x0016, 0x0804, 0x308f, 0x81ff, 0x0128, 0x012e, 0x2021, ++ 0x400b, 0x0804, 0x3061, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, ++ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3535, 0x2009, 0x0101, 0x210c, ++ 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, ++ 0x3c52, 0x080c, 0x3bab, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, ++ 0x2940, 0x2071, 0x1a33, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, ++ 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, ++ 0x2011, 0x0001, 0x080c, 0x3b2b, 0x080c, 0x27ef, 0x080c, 0x27ef, ++ 0x080c, 0x27ef, 0x080c, 0x27ef, 0x080c, 0x3b2b, 0x008e, 0x00ee, ++ 0x00fe, 0x080c, 0x3a61, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, ++ 0x1dd0, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, ++ 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3a3f, 0x2d00, ++ 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3974, 0x0804, 0x3921, 0x080c, ++ 0x3b7f, 0x080c, 0x3ac3, 0x080c, 0x3a22, 0x080c, 0x3a57, 0x00f6, ++ 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3974, ++ 0x00fe, 0x0804, 0x3921, 0x00fe, 0x080c, 0x396a, 0x1150, 0x8d68, ++ 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3974, ++ 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, ++ 0x8739, 0x0038, 0x2001, 0x1a30, 0x2004, 0x9086, 0x0000, 0x1904, ++ 0x3871, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, ++ 0x2500, 0x9605, 0x0904, 0x3921, 0x7884, 0xd0bc, 0x0128, 0x2d00, ++ 0x9c05, 0x9b05, 0x1904, 0x3921, 0xa013, 0x0019, 0x2001, 0x032a, ++ 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a30, 0x2003, ++ 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, ++ 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, ++ 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, ++ 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x38f8, 0x00ce, ++ 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 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, ++ 0x3845, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, ++ 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, ++ 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1245, ++ 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, ++ 0x080c, 0x2014, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, ++ 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, ++ 0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, ++ 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, ++ 0x008e, 0x1118, 0x012e, 0x0804, 0x305f, 0x012e, 0x2021, 0x400c, ++ 0x0804, 0x3061, 0x9085, 0x0001, 0x1d04, 0x3973, 0x2091, 0x6000, ++ 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, ++ 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a30, 0x2003, 0x0000, ++ 0x0051, 0x2009, 0x0048, 0x080c, 0x2014, 0x2001, 0x0227, 0x2024, ++ 0x2402, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a33, 0x7000, ++ 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, ++ 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, ++ 0x2014, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x3b7f, 0x7000, 0x9086, ++ 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, ++ 0x0040, 0x080c, 0x2014, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, ++ 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1816, 0x200c, ++ 0x7932, 0x7936, 0x080c, 0x2446, 0x7850, 0x9084, 0xfbff, 0x9085, ++ 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf, ++ 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x39d5, 0x2091, ++ 0x6000, 0x1f04, 0x39d5, 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, 0x39f5, ++ 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, 0x28a5, 0x7827, ++ 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x28a5, 0x7827, 0x0048, ++ 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, ++ 0x1a30, 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, 0x8c60, ++ 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, ++ 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, ++ 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x1977, 0x2004, 0x70e2, ++ 0x080c, 0x376f, 0x1188, 0x2001, 0x181e, 0x2004, 0x2009, 0x181d, ++ 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, ++ 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, ++ 0x2009, 0x1816, 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, 0x3b7f, ++ 0x00f6, 0x2071, 0x1a30, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, ++ 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, ++ 0x2011, 0x0011, 0x080c, 0x3b2b, 0x2011, 0x0001, 0x080c, 0x3b2b, ++ 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a30, 0x2079, ++ 0x0320, 0x792c, 0xd1fc, 0x0904, 0x3b28, 0x782b, 0x0002, 0x9026, ++ 0xd19c, 0x1904, 0x3b24, 0x7000, 0x0002, 0x3b28, 0x3ad9, 0x3b09, ++ 0x3b24, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, ++ 0x0001, 0x080c, 0x3b2b, 0x0904, 0x3b28, 0x080c, 0x3b2b, 0x0804, ++ 0x3b28, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, ++ 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, ++ 0x81ff, 0x0de8, 0x080c, 0x3a3f, 0x2009, 0x0001, 0x00f6, 0x2079, ++ 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, ++ 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, ++ 0x1904, 0x3acd, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, ++ 0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, ++ 0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, ++ 0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0540, 0x8001, 0x0036, ++ 0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0025, 0x911a, ++ 0x831c, 0x831c, 0x938a, 0x0004, 0x1a0c, 0x0d84, 0x9398, 0x3b57, ++ 0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, ++ 0x009e, 0x003e, 0x908a, 0x0029, 0x1130, 0xa058, 0x2048, 0xa804, ++ 0xa05a, 0x2001, 0x0019, 0xa012, 0x9085, 0x0001, 0x0005, 0x3b76, ++ 0x3b6d, 0x3b64, 0x3b5b, 0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, ++ 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978, 0x7906, ++ 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902, 0xa988, ++ 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994, 0x7902, ++ 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005, 0x00f6, ++ 0x00e6, 0x0086, 0x2071, 0x1a33, 0x2079, 0x0090, 0x792c, 0xd1fc, ++ 0x01f0, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x3ba7, ++ 0x3b92, 0x3b9e, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, ++ 0x080c, 0x3b2b, 0x0160, 0x080c, 0x3b2b, 0x0048, 0x8001, 0x7002, ++ 0x782c, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x3b2b, 0x008e, ++ 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, ++ 0x0200, 0x2001, 0x1977, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, ++ 0x1976, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, ++ 0x2004, 0x9005, 0x0518, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, ++ 0x002f, 0x201c, 0x080c, 0x441f, 0xa813, 0x0019, 0xaf16, 0x2900, ++ 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, ++ 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, ++ 0x009e, 0x04c1, 0x1d70, 0x2900, 0xa85a, 0x0080, 0x080c, 0x441f, ++ 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, ++ 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, ++ 0x2079, 0x0100, 0x2001, 0x1976, 0x2004, 0x6036, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, ++ 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0xa872, 0x601e, 0x78c6, ++ 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, ++ 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 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, 0x0190, 0x0086, 0x0096, ++ 0x2940, 0x0086, 0x080c, 0x441f, 0x008e, 0xa058, 0x00a6, 0x2050, ++ 0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, ++ 0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, ++ 0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, ++ 0x441f, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, ++ 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, ++ 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, ++ 0x3c1a, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x441f, 0x2940, ++ 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, ++ 0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, ++ 0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, ++ 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, ++ 0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, ++ 0x1a30, 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, 0x1840, 0x20e9, 0x0001, ++ 0x20a0, 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, ++ 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, 0x305f, 0x7d98, 0x7c9c, ++ 0x0804, 0x3154, 0x080c, 0x6877, 0x0110, 0x080c, 0x569e, 0x2069, ++ 0x1852, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, ++ 0x2039, 0x0001, 0x080c, 0x4468, 0x701b, 0x3cef, 0x0005, 0x080c, ++ 0x4df9, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, ++ 0x2069, 0x1852, 0x6800, 0x9005, 0x0904, 0x3092, 0x6804, 0xd0ac, ++ 0x0118, 0xd0a4, 0x0904, 0x3092, 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, ++ 0x3092, 0x9288, 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x615e, 0xd0dc, ++ 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3092, 0x6056, 0x6888, ++ 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, ++ 0x197e, 0x9080, 0x2539, 0x2005, 0x200a, 0x000e, 0x2009, 0x197f, ++ 0x9080, 0x253d, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, ++ 0x3092, 0x908a, 0x0841, 0x1a04, 0x3092, 0x9084, 0x0007, 0x1904, ++ 0x3092, 0x680c, 0x9005, 0x0904, 0x3092, 0x6810, 0x9005, 0x0904, ++ 0x3092, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3092, 0x8001, 0x0904, ++ 0x3092, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3092, 0x8001, 0x0904, ++ 0x3092, 0x6980, 0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, ++ 0x9085, 0x0100, 0x6006, 0x00ce, 0x2009, 0x194e, 0x200b, 0x0000, ++ 0x2001, 0x1874, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, ++ 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, ++ 0x6146, 0x8007, 0x9084, 0x00ff, 0x604a, 0x080c, 0x6b71, 0x080c, ++ 0x5f63, 0x080c, 0x5f97, 0x6808, 0x602a, 0x080c, 0x1f86, 0x2009, ++ 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, ++ 0x6b08, 0x080c, 0x24a0, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, ++ 0x3e96, 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, 0x1980, 0x20e9, ++ 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199a, 0x20e9, 0x0001, ++ 0x4001, 0x080c, 0x791c, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, ++ 0xd384, 0x0510, 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, ++ 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, ++ 0x080c, 0x70f4, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, ++ 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, ++ 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x3deb, 0x00ce, 0x00c6, ++ 0x2061, 0x1969, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, ++ 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2747, 0x2001, ++ 0x0001, 0x080c, 0x272a, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, ++ 0x0001, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, 0x0028, ++ 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70, ++ 0x080c, 0x0e3b, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, ++ 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, ++ 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, ++ 0x194b, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, ++ 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, ++ 0x2515, 0x2001, 0x193c, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, ++ 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x6877, ++ 0x0128, 0x080c, 0x46fa, 0x0110, 0x080c, 0x2466, 0x60d0, 0x9005, ++ 0x01c0, 0x6003, 0x0001, 0x2009, 0x3e7e, 0x00d0, 0x080c, 0x6877, ++ 0x1168, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c, ++ 0x78e7, 0x080c, 0x6b45, 0x080c, 0x67be, 0x0040, 0x080c, 0x55a0, ++ 0x0028, 0x6003, 0x0004, 0x2009, 0x3e96, 0x0010, 0x0804, 0x305f, ++ 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, ++ 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, ++ 0x0000, 0x0904, 0x308f, 0x2069, 0x1852, 0x7890, 0x6842, 0x7894, ++ 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, ++ 0x2039, 0x0001, 0x0804, 0x446b, 0x9006, 0x080c, 0x2466, 0x81ff, ++ 0x1904, 0x308f, 0x080c, 0x6877, 0x1168, 0x080c, 0x6b40, 0x080c, ++ 0x56d9, 0x080c, 0x2e69, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, ++ 0x67be, 0x0020, 0x080c, 0x569e, 0x080c, 0x55a0, 0x0804, 0x305f, ++ 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, 0x1110, 0x0804, 0x308f, ++ 0x618c, 0x81ff, 0x01a8, 0x704b, 0x0000, 0x2001, 0x1c80, 0x2009, ++ 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, ++ 0x2039, 0x0001, 0x080c, 0x446b, 0x701b, 0x305d, 0x012e, 0x0005, ++ 0x704b, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, 0x20e9, ++ 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x6554, 0x9588, ++ 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, ++ 0x2100, 0x9506, 0x01a8, 0x080c, 0x5c0d, 0x1190, 0xb814, 0x821c, ++ 0x0238, 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, ++ 0x9398, 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, ++ 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, ++ 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1c80, 0x2099, ++ 0x1c80, 0x080c, 0x5634, 0x0804, 0x3ee5, 0x080c, 0x4452, 0x0904, ++ 0x3092, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, ++ 0x080c, 0x4dea, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, ++ 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x2e64, ++ 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, ++ 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, ++ 0xb258, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, ++ 0x701b, 0x3f73, 0x0005, 0x080c, 0x4452, 0x0904, 0x3092, 0x20a9, ++ 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, ++ 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, ++ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, ++ 0x0f2b, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, ++ 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, ++ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, ++ 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, ++ 0x446b, 0x81ff, 0x1904, 0x308f, 0x080c, 0x4436, 0x0904, 0x3092, ++ 0x080c, 0x5d7f, 0x0904, 0x308f, 0x0058, 0xa878, 0x9005, 0x0120, ++ 0x2009, 0x0004, 0x0804, 0x308f, 0xa974, 0xaa94, 0x0804, 0x305f, ++ 0x080c, 0x4df2, 0x0904, 0x305f, 0x701b, 0x3fbd, 0x7007, 0x0003, ++ 0x0005, 0x81ff, 0x1904, 0x308f, 0x7888, 0x908a, 0x1000, 0x1a04, ++ 0x3092, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x5e04, 0x0904, ++ 0x308f, 0x2019, 0x0004, 0x900e, 0x080c, 0x5d91, 0x0904, 0x308f, ++ 0x7984, 0x7a88, 0x0499, 0x08e0, 0xa89c, 0x908a, 0x1000, 0x12c8, ++ 0x080c, 0x4450, 0x01b0, 0x080c, 0x5e04, 0x2009, 0x0002, 0x0168, ++ 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x5d91, 0x2009, 0x0003, ++ 0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, ++ 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, ++ 0x0005, 0xa897, 0x4000, 0x080c, 0x4df2, 0x0110, 0x9006, 0x0018, ++ 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, ++ 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6454, ++ 0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, ++ 0x080c, 0x5c0d, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, ++ 0x080c, 0x7826, 0x0005, 0x81ff, 0x1904, 0x308f, 0x080c, 0x4436, ++ 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, 0x080c, 0x5d88, ++ 0x0904, 0x308f, 0x0804, 0x3fc8, 0x81ff, 0x1904, 0x308f, 0x080c, ++ 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, 0x080c, ++ 0x5d76, 0x0904, 0x308f, 0x0804, 0x3fc8, 0x6100, 0x0804, 0x305f, ++ 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x4dfe, 0x1904, 0x308f, ++ 0x79a8, 0xd184, 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, ++ 0x789a, 0xbb2c, 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, ++ 0x789e, 0xb820, 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, ++ 0xb900, 0x918c, 0x0200, 0x0804, 0x305f, 0x78a8, 0x909c, 0x0003, ++ 0xd0b4, 0x1150, 0x939a, 0x0003, 0x1a04, 0x308f, 0x6254, 0x9294, ++ 0x00ff, 0x7884, 0x9206, 0x1560, 0x2031, 0x1848, 0x2009, 0x013c, ++ 0x2136, 0x2001, 0x1840, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, ++ 0x000e, 0x0804, 0x446b, 0x000e, 0x2031, 0x0000, 0x2061, 0x18ac, ++ 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, ++ 0xa59a, 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x40df, 0x0005, ++ 0x81ff, 0x1904, 0x308f, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, ++ 0x5f2d, 0x1904, 0x308f, 0x00c6, 0x080c, 0x441f, 0x00ce, 0x0904, ++ 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb1fe, ++ 0x0904, 0x308f, 0x7007, 0x0003, 0x701b, 0x40e3, 0x0005, 0x080c, ++ 0x3cbf, 0x0804, 0x305f, 0xa830, 0x9086, 0x0100, 0x0904, 0x308f, ++ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, ++ 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, ++ 0x446b, 0x9006, 0x080c, 0x2466, 0x78a8, 0x9084, 0x00ff, 0x9086, ++ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, 0x0110, ++ 0x080c, 0x569e, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3092, 0x7984, ++ 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3092, 0x2100, ++ 0x080c, 0x2430, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, ++ 0x19c7, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, 0x6877, 0x1158, ++ 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x080c, 0x68c0, ++ 0x080c, 0x67be, 0x00d0, 0x080c, 0x94da, 0x2061, 0x0100, 0x2001, ++ 0x1816, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, ++ 0x0090, 0x6043, 0x0010, 0x2009, 0x1966, 0x200b, 0x0000, 0x2009, ++ 0x002d, 0x2011, 0x55ca, 0x080c, 0x78a5, 0x7984, 0x080c, 0x6877, ++ 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x401e, 0x012e, 0x00ce, ++ 0x002e, 0x0804, 0x305f, 0x7984, 0x080c, 0x5bb0, 0x2b08, 0x1904, ++ 0x3092, 0x0804, 0x305f, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, ++ 0x0804, 0x308f, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x308f, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, ++ 0x0019, 0x7026, 0xaf60, 0x7732, 0x080c, 0x4468, 0x701b, 0x4189, ++ 0x0005, 0x2009, 0x0080, 0x080c, 0x5c0d, 0x1118, 0x080c, 0x5f2d, ++ 0x0120, 0x2021, 0x400a, 0x0804, 0x3061, 0x00d6, 0x0096, 0xa964, ++ 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, ++ 0x0904, 0x4222, 0x90be, 0x0112, 0x0904, 0x4222, 0x90be, 0x0113, ++ 0x0904, 0x4222, 0x90be, 0x0114, 0x0904, 0x4222, 0x90be, 0x0117, ++ 0x0904, 0x4222, 0x90be, 0x011a, 0x0904, 0x4222, 0x90be, 0x011c, ++ 0x0904, 0x4222, 0x90be, 0x0121, 0x0904, 0x4209, 0x90be, 0x0131, ++ 0x0904, 0x4209, 0x90be, 0x0171, 0x0904, 0x4222, 0x90be, 0x0173, ++ 0x0904, 0x4222, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, ++ 0x0804, 0x422d, 0x90be, 0x0212, 0x0904, 0x4216, 0x90be, 0x0213, ++ 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, ++ 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, ++ 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x3092, ++ 0x7024, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7030, 0x20e0, 0x20e8, ++ 0x20a9, 0x0007, 0x080c, 0x426b, 0x7024, 0x9080, 0x000e, 0x2098, ++ 0x20a0, 0x7030, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x426b, ++ 0x00c8, 0x7024, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7030, 0x20e0, ++ 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4278, 0x00b8, 0x7024, 0x9080, ++ 0x000e, 0x2098, 0x20a0, 0x7030, 0x20e0, 0x20e8, 0x20a9, 0x0001, ++ 0x080c, 0x4278, 0x7024, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7030, ++ 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x441f, ++ 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, ++ 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, ++ 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, ++ 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, ++ 0xb219, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, ++ 0x701b, 0x4262, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, ++ 0x0804, 0x308f, 0xa820, 0x9086, 0x8001, 0x1904, 0x305f, 0x2009, ++ 0x0004, 0x0804, 0x308f, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, ++ 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, ++ 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, ++ 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, ++ 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, ++ 0x0804, 0x308f, 0x7984, 0x78a8, 0x2040, 0x080c, 0x94d3, 0x1120, ++ 0x9182, 0x007f, 0x0a04, 0x3092, 0x9186, 0x00ff, 0x0904, 0x3092, ++ 0x9182, 0x0800, 0x1a04, 0x3092, 0x7a8c, 0x7b88, 0x6074, 0x9306, ++ 0x1140, 0x6078, 0x924e, 0x0904, 0x3092, 0x99cc, 0xff00, 0x0904, ++ 0x3092, 0x080c, 0x435a, 0x0538, 0x90c6, 0x4000, 0x1170, 0x00c6, ++ 0x0006, 0x900e, 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, ++ 0x0108, 0xc18d, 0x000e, 0x00ce, 0x0098, 0x90c6, 0x4007, 0x1110, ++ 0x2408, 0x0070, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0040, ++ 0x90c6, 0x4009, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, 0x000a, ++ 0x2020, 0x0804, 0x3061, 0x2b00, 0x7022, 0x0016, 0x00b6, 0x00c6, ++ 0x00e6, 0x2c70, 0x080c, 0x95a1, 0x0904, 0x4330, 0x2b00, 0x6012, ++ 0x080c, 0xb4e6, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x441f, ++ 0x00ce, 0x2b70, 0x1150, 0x080c, 0x9554, 0x00ee, 0x00ce, 0x00be, ++ 0x001e, 0x2009, 0x0002, 0x0804, 0x308f, 0x900e, 0xa966, 0xa96a, ++ 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, ++ 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2d1a, 0x012e, 0x6023, ++ 0x0001, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, ++ 0x2009, 0x0002, 0x080c, 0x95ce, 0x78a8, 0xd094, 0x0138, 0x00ee, ++ 0x7020, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001, ++ 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804, ++ 0x308f, 0x7007, 0x0003, 0x701b, 0x433e, 0x0005, 0xa830, 0x9086, ++ 0x0100, 0x7020, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, ++ 0x00ff, 0x0804, 0x4d49, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x305f, ++ 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, ++ 0x0804, 0x305f, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x080c, 0x94d3, ++ 0x0138, 0x2021, 0x0000, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, ++ 0x2021, 0x0080, 0x20a9, 0x0780, 0x2071, 0x1080, 0x2e04, 0x9005, ++ 0x1130, 0x2100, 0x9406, 0x1550, 0x2428, 0xc5fd, 0x0438, 0x2058, ++ 0xbf10, 0x2700, 0x9306, 0x11a0, 0xbe14, 0x2600, 0x9206, 0x1180, ++ 0x2400, 0x9106, 0x1150, 0xd884, 0x0550, 0xd894, 0x1540, 0x080c, ++ 0x5f2d, 0x1528, 0x2001, 0x4000, 0x0418, 0x2001, 0x4007, 0x0400, ++ 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x09e0, ++ 0x080c, 0x94d3, 0x19c8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, ++ 0x1f04, 0x436e, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, ++ 0x0001, 0x0030, 0x080c, 0x5bb0, 0x1dd0, 0xbb12, 0xba16, 0x9006, ++ 0x9005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x308f, 0x080c, ++ 0x441f, 0x0904, 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, ++ 0x7884, 0x9005, 0x0904, 0x3092, 0x9096, 0x00ff, 0x0120, 0x9092, ++ 0x0004, 0x1a04, 0x3092, 0x2010, 0x2918, 0x080c, 0x2cc0, 0x0904, ++ 0x308f, 0x7007, 0x0003, 0x701b, 0x43d6, 0x0005, 0xa830, 0x9086, ++ 0x0100, 0x0904, 0x308f, 0x0804, 0x305f, 0x7984, 0x080c, 0x94d3, ++ 0x1120, 0x9182, 0x0080, 0x0a04, 0x3092, 0x9186, 0x00ff, 0x0904, ++ 0x3092, 0x9182, 0x0800, 0x1a04, 0x3092, 0x2001, 0x9000, 0x080c, ++ 0x4da2, 0x1904, 0x308f, 0x0804, 0x305f, 0xa998, 0x080c, 0x94d3, ++ 0x1118, 0x9182, 0x0080, 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, ++ 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x4da2, 0x11a8, 0x0060, ++ 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, ++ 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x900e, 0x9085, ++ 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, 0x0c48, 0x080c, ++ 0x0fae, 0x0198, 0x9006, 0xa802, 0x7010, 0x9005, 0x1120, 0x2900, ++ 0x7012, 0x7016, 0x0040, 0x7014, 0xa802, 0x0086, 0x2040, 0x2900, ++ 0xa006, 0x7016, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, ++ 0x5c0d, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, ++ 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x5c0d, 0x1130, 0xae9c, ++ 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, ++ 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x5c0d, 0x1108, 0x0008, ++ 0x905e, 0x8bff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2148, ++ 0xa904, 0x080c, 0x0fe0, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, ++ 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18ac, 0x2c44, ++ 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, ++ 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x305f, 0x0005, 0x00f6, ++ 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18a4, 0x2004, ++ 0x9005, 0x1188, 0x0e04, 0x449b, 0x7a36, 0x7833, 0x0012, 0x7a82, ++ 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, ++ 0x190c, 0x113e, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, 0x1893, ++ 0x7144, 0x9182, 0x0010, 0x0218, 0x7034, 0x2060, 0x0078, 0x7034, ++ 0x90e0, 0x0004, 0x9c82, 0x18ee, 0x0210, 0x2061, 0x18ae, 0x2c00, ++ 0x7036, 0x81ff, 0x1108, 0x703a, 0x8108, 0x7146, 0x2262, 0x6306, ++ 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, 0x00e6, ++ 0x2071, 0x1893, 0x7044, 0x9005, 0x0590, 0x0126, 0x2091, 0x8000, ++ 0x0e04, 0x44f6, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x7038, 0x2060, ++ 0x2c04, 0x7836, 0x7833, 0x0012, 0x7882, 0x6004, 0x7886, 0x6008, ++ 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, ++ 0x113e, 0x7044, 0x8001, 0x7046, 0x9005, 0x1130, 0x7037, 0x18ae, ++ 0x703b, 0x18ae, 0x00ce, 0x0048, 0x9c80, 0x0004, 0x90fa, 0x18ee, ++ 0x0210, 0x2001, 0x18ae, 0x703a, 0x00ce, 0x00fe, 0x012e, 0x00ee, ++ 0x0005, 0x0026, 0x080c, 0x4dea, 0xd0c4, 0x0120, 0x2011, 0x8014, ++ 0x080c, 0x447f, 0x002e, 0x0005, 0x81ff, 0x1904, 0x308f, 0x0126, ++ 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, ++ 0x6877, 0x1158, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, ++ 0x080c, 0x68c0, 0x080c, 0x67be, 0x0010, 0x080c, 0x55a0, 0x012e, ++ 0x0804, 0x305f, 0x7884, 0x2008, 0x918c, 0xfffd, 0x1128, 0x61e4, ++ 0x910d, 0x61e6, 0x0804, 0x305f, 0x0804, 0x3092, 0x81ff, 0x1904, ++ 0x308f, 0x080c, 0x4dfe, 0x1904, 0x308f, 0x080c, 0x5f25, 0x1904, ++ 0x308f, 0x080c, 0x2e64, 0x0128, 0x7984, 0x080c, 0x5bb0, 0x1904, ++ 0x3092, 0x080c, 0x4452, 0x0904, 0x3092, 0x2b00, 0x7022, 0x080c, ++ 0x5f2d, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, ++ 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, ++ 0x305f, 0x080c, 0x441f, 0x0904, 0x308f, 0x9006, 0xa866, 0xa832, ++ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb2a8, 0x0904, 0x308f, 0x7888, ++ 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x7007, 0x0003, 0x701b, ++ 0x45bd, 0x0005, 0x2061, 0x1800, 0x080c, 0x4dfe, 0x2009, 0x0007, ++ 0x1570, 0x080c, 0x5f25, 0x2009, 0x0008, 0x1548, 0x080c, 0x2e64, ++ 0x0120, 0xa998, 0x080c, 0x5bb0, 0x1530, 0x080c, 0x4450, 0x0518, ++ 0x080c, 0x5f2d, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, ++ 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, ++ 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xb2a8, 0x11e0, 0xa89c, ++ 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x2009, 0x0003, 0xa897, ++ 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, ++ 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, ++ 0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x9086, 0x0100, ++ 0x7020, 0x2058, 0x1110, 0x0804, 0x4d49, 0x900e, 0x080c, 0x5e2d, ++ 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x305f, ++ 0x080c, 0x4dfe, 0x1904, 0x308f, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0x080c, 0x441f, 0x0904, 0x308f, 0x900e, 0x2130, 0x7122, ++ 0x712e, 0xa860, 0x20e8, 0x7032, 0xa85c, 0x9080, 0x0005, 0x7026, ++ 0x20a0, 0x080c, 0x5c0d, 0x1904, 0x464d, 0x080c, 0x5f2d, 0x0120, ++ 0x080c, 0x5f35, 0x1904, 0x464d, 0x080c, 0x5f25, 0x1130, 0x080c, ++ 0x5e2d, 0x1118, 0xd79c, 0x0904, 0x464d, 0xd794, 0x1110, 0xd784, ++ 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, ++ 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, ++ 0x20e0, 0x20a9, 0x0002, 0x080c, 0x4278, 0x0048, 0x20a9, 0x0004, ++ 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4278, 0x4104, ++ 0xd794, 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80, 0x0000, ++ 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9, ++ 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, ++ 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x426b, 0x9c80, ++ 0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, ++ 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x94d3, ++ 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, ++ 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, ++ 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x45e9, 0x86ff, ++ 0x1120, 0x7120, 0x810b, 0x0804, 0x305f, 0x702f, 0x0001, 0x711e, ++ 0x7020, 0x9600, 0x7022, 0x772a, 0x2061, 0x18ac, 0x2c44, 0xa06b, ++ 0x0000, 0xa67a, 0x7030, 0xa072, 0x7024, 0xa076, 0xa28e, 0xa392, ++ 0xa496, 0xa59a, 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x4689, ++ 0x0005, 0x702c, 0x9005, 0x1180, 0x711c, 0x7024, 0x20a0, 0x7728, ++ 0x9036, 0x7030, 0x20e8, 0x2061, 0x18ac, 0x2c44, 0xa28c, 0xa390, ++ 0xa494, 0xa598, 0x0804, 0x45e9, 0x7120, 0x810b, 0x0804, 0x305f, ++ 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, ++ 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, ++ 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, ++ 0x3092, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, ++ 0x9502, 0x0a04, 0x3092, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, ++ 0x3092, 0x9502, 0x0a04, 0x3092, 0x9384, 0xff00, 0x8007, 0x90e2, ++ 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, 0x9384, 0x00ff, ++ 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, 0x9484, ++ 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, ++ 0x3092, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, ++ 0x0a04, 0x3092, 0x2061, 0x1956, 0x6102, 0x6206, 0x630a, 0x640e, ++ 0x0804, 0x305f, 0x0006, 0x080c, 0x4dea, 0xd0cc, 0x000e, 0x0005, ++ 0x0006, 0x080c, 0x4dee, 0xd0bc, 0x000e, 0x0005, 0x616c, 0x7a84, ++ 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x305f, 0x83ff, 0x1904, ++ 0x3092, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3092, 0x2019, 0xffff, ++ 0x6070, 0x9302, 0x9200, 0x0a04, 0x3092, 0x7986, 0x626e, 0x0804, ++ 0x305f, 0x080c, 0x4dfe, 0x1904, 0x308f, 0x7c88, 0x7d84, 0x7e98, ++ 0x7f8c, 0x080c, 0x441f, 0x0904, 0x308f, 0x900e, 0x901e, 0x7322, ++ 0x732e, 0xa860, 0x20e8, 0x7032, 0xa85c, 0x9080, 0x0003, 0x7026, ++ 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, ++ 0x0118, 0x080c, 0x5f35, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, ++ 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, ++ 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7220, ++ 0x900e, 0x2001, 0x0003, 0x080c, 0x7a4b, 0x2208, 0x0804, 0x305f, ++ 0x702f, 0x0001, 0x711e, 0x7020, 0x9300, 0x7022, 0x2061, 0x18ac, ++ 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7024, 0xa076, 0x7030, 0xa072, ++ 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x108c, 0x7007, 0x0002, ++ 0x701b, 0x477b, 0x0005, 0x702c, 0x9005, 0x1178, 0x711c, 0x7024, ++ 0x20a0, 0x901e, 0x7030, 0x20e8, 0x2061, 0x18ac, 0x2c44, 0xa48c, ++ 0xa590, 0xa694, 0xa798, 0x0804, 0x4739, 0x7220, 0x900e, 0x2001, ++ 0x0003, 0x080c, 0x7a4b, 0x2208, 0x0804, 0x305f, 0x00f6, 0x00e6, ++ 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x480e, 0x2071, 0x1893, ++ 0x7458, 0x84ff, 0x2009, 0x000e, 0x1904, 0x480e, 0xac9c, 0xad98, ++ 0xaea4, 0xafa0, 0x0096, 0x080c, 0x0fc7, 0x2009, 0x0002, 0x0904, ++ 0x480e, 0x2900, 0x705a, 0x900e, 0x901e, 0x7352, 0x735e, 0xa860, ++ 0x7062, 0xa85c, 0x9080, 0x0003, 0x7056, 0x20a0, 0x91d8, 0x1000, ++ 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, 0x0118, 0x080c, 0x5f35, ++ 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, ++ 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, ++ 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7250, 0x900e, 0x2001, 0x0003, ++ 0x080c, 0x7a4b, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x7158, ++ 0x81ff, 0x090c, 0x0d84, 0x2148, 0x080c, 0x0fe0, 0x9006, 0x705a, ++ 0x918d, 0x0001, 0x2008, 0x0418, 0x705f, 0x0001, 0x714e, 0x7050, ++ 0x9300, 0x7052, 0x2061, 0x18ad, 0x2c44, 0xa37a, 0x7054, 0xa076, ++ 0x7060, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x481a, ++ 0x000e, 0xa0a2, 0x080c, 0x108c, 0x9006, 0x0048, 0x009e, 0xa897, ++ 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, ++ 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d84, 0x00e6, ++ 0x2071, 0x1893, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, ++ 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x705c, 0x9005, 0x1158, ++ 0x714c, 0x7054, 0x20a0, 0x901e, 0x7060, 0x20e8, 0xa48c, 0xa590, ++ 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, ++ 0x4000, 0x7250, 0x900e, 0x2001, 0x0003, 0x080c, 0x7a4b, 0xaa9a, ++ 0x7158, 0x81ff, 0x090c, 0x0d84, 0x2148, 0x080c, 0x0fe0, 0x705b, ++ 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, ++ 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, ++ 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, 0x0118, ++ 0x080c, 0x5f35, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, ++ 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, ++ 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7150, 0x810c, ++ 0xa99a, 0xa897, 0x4000, 0x7158, 0x81ff, 0x090c, 0x0d84, 0x2148, ++ 0x080c, 0x0fe0, 0x9006, 0x705a, 0x918d, 0x0001, 0x2008, 0xa0a0, ++ 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0xa09f, ++ 0x0000, 0xa0a3, 0x0000, 0x0070, 0x705f, 0x0001, 0x714e, 0x7050, ++ 0x9300, 0x7052, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, ++ 0x108c, 0x9006, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x308f, 0x60d8, ++ 0xd0ac, 0x1118, 0xd09c, 0x0904, 0x308f, 0x080c, 0x441f, 0x0904, ++ 0x308f, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, ++ 0x0019, 0xaf60, 0x080c, 0x4468, 0x701b, 0x48c7, 0x0005, 0x0096, ++ 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, ++ 0x7200, 0x0118, 0x009e, 0x0804, 0x3092, 0xa884, 0xa988, 0x080c, ++ 0x23fd, 0x1500, 0x080c, 0x5bb0, 0x11e8, 0x7122, 0xbe12, 0xbd16, ++ 0xae7c, 0x080c, 0x441f, 0x01b0, 0x080c, 0x441f, 0x0198, 0x009e, ++ 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa887, 0x0000, 0xa804, ++ 0x2048, 0x080c, 0xb239, 0x0904, 0x308f, 0x7007, 0x0003, 0x701b, ++ 0x48fd, 0x0005, 0x009e, 0x0804, 0x308f, 0x7120, 0x080c, 0x2e11, ++ 0xa884, 0x9086, 0x8001, 0x0904, 0x308f, 0x2900, 0x701e, 0xa804, ++ 0x2040, 0x0086, 0xa05c, 0x9080, 0x0002, 0x2098, 0x20a0, 0xa060, ++ 0x20e0, 0x20e8, 0x20a9, 0x002a, 0x080c, 0x0f2b, 0xaa6c, 0xab70, ++ 0xac74, 0xad78, 0x2061, 0x18ac, 0x2c44, 0xa06b, 0x0000, 0xae64, ++ 0xaf8c, 0x97c6, 0x7000, 0x1108, 0x0018, 0x97c6, 0x7100, 0x1190, ++ 0x96c2, 0x0004, 0x0a04, 0x3092, 0x2009, 0x0004, 0x009e, 0x8906, ++ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, ++ 0x0804, 0x446b, 0x97c6, 0x7200, 0x1904, 0x3092, 0x96c2, 0x0054, ++ 0x0a04, 0x3092, 0x009e, 0x2061, 0x18ac, 0x2c44, 0x8906, 0x8006, ++ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, ++ 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, ++ 0x108c, 0x7007, 0x0002, 0x701b, 0x495e, 0x0005, 0x701c, 0x2048, ++ 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, ++ 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, ++ 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f2b, 0x2100, 0x2238, 0x2061, ++ 0x18ac, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, ++ 0x0804, 0x446b, 0x81ff, 0x1904, 0x308f, 0x798c, 0x2001, 0x194d, ++ 0x2102, 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, ++ 0x308f, 0x0126, 0x2091, 0x8000, 0x080c, 0x5d9a, 0x012e, 0x0904, ++ 0x308f, 0x0804, 0x3fc8, 0xa9a0, 0x2001, 0x194d, 0xc18d, 0x2102, ++ 0x080c, 0x4443, 0x0170, 0x080c, 0x5cd4, 0x2009, 0x0002, 0x0128, ++ 0x080c, 0x5d9a, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, ++ 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, ++ 0x0005, 0xa897, 0x4000, 0x080c, 0x4df2, 0x0110, 0x9006, 0x0018, ++ 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, ++ 0x1118, 0xd084, 0x0904, 0x3f3d, 0x080c, 0x4452, 0x0904, 0x3092, ++ 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0x080c, ++ 0x5f2d, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, ++ 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, ++ 0x4dea, 0xd0b4, 0x0904, 0x3f77, 0x7884, 0x908e, 0x007e, 0x0904, ++ 0x3f77, 0x908e, 0x007f, 0x0904, 0x3f77, 0x908e, 0x0080, 0x0904, ++ 0x3f77, 0xb800, 0xd08c, 0x1904, 0x3f77, 0xa867, 0x0000, 0xa868, ++ 0xc0fd, 0xa86a, 0x080c, 0xb258, 0x1120, 0x2009, 0x0003, 0x0804, ++ 0x308f, 0x7007, 0x0003, 0x701b, 0x4a0e, 0x0005, 0x080c, 0x4452, ++ 0x0904, 0x3092, 0x0804, 0x3f77, 0x080c, 0x2e64, 0x0108, 0x0005, ++ 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x080c, 0x4dfe, 0x0120, 0x2009, 0x0007, 0x0804, 0x308f, ++ 0x080c, 0x5f25, 0x0120, 0x2009, 0x0008, 0x0804, 0x308f, 0xb89c, ++ 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3f77, 0x9006, 0xa866, 0xa832, ++ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb2a8, 0x1120, 0x2009, 0x0003, ++ 0x0804, 0x308f, 0x7007, 0x0003, 0x701b, 0x4a47, 0x0005, 0xa830, ++ 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x4d49, 0x080c, ++ 0x4452, 0x0904, 0x3092, 0x0804, 0x49e0, 0x81ff, 0x2009, 0x0001, ++ 0x1904, 0x308f, 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x308f, ++ 0x080c, 0x5f25, 0x2009, 0x0008, 0x1904, 0x308f, 0x080c, 0x4452, ++ 0x0904, 0x3092, 0x080c, 0x5f2d, 0x2009, 0x0009, 0x1904, 0x308f, ++ 0x080c, 0x441f, 0x2009, 0x0002, 0x0904, 0x308f, 0x9006, 0xa866, ++ 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, ++ 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, ++ 0x0038, 0x928e, 0x0100, 0x1904, 0x3092, 0xc0e5, 0xa952, 0xa956, ++ 0xa83e, 0x080c, 0xb4e7, 0x2009, 0x0003, 0x0904, 0x308f, 0x7007, ++ 0x0003, 0x701b, 0x4a9c, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, ++ 0x0004, 0x0904, 0x308f, 0x0804, 0x305f, 0x7aa8, 0x9284, 0xc000, ++ 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x4dfe, 0x1188, 0x2009, 0x0014, ++ 0x0804, 0x308f, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, ++ 0x308f, 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x308f, 0xd2f4, ++ 0x0130, 0x9284, 0x5000, 0x080c, 0x4dc5, 0x0804, 0x305f, 0xd2fc, ++ 0x0158, 0x080c, 0x4452, 0x0904, 0x3092, 0x7984, 0x9284, 0x9000, ++ 0x080c, 0x4da2, 0x0804, 0x305f, 0x080c, 0x4452, 0x0904, 0x3092, ++ 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, ++ 0x4b85, 0x080c, 0x441f, 0x2009, 0x0002, 0x0904, 0x4b85, 0xa85c, ++ 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0x080c, 0x4468, 0x701b, 0x4af6, 0x0005, 0xa86c, 0x9086, ++ 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, ++ 0x0110, 0x1904, 0x3092, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, ++ 0x080c, 0x4452, 0x1110, 0x0804, 0x3092, 0x2009, 0x0043, 0x080c, ++ 0xb54f, 0x2009, 0x0003, 0x0904, 0x4b85, 0x7007, 0x0003, 0x701b, ++ 0x4b1a, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, ++ 0x4b85, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x4da2, 0x0804, ++ 0x305f, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, ++ 0x080c, 0x4dfe, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, ++ 0x080c, 0x4dfe, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, ++ 0x5000, 0x080c, 0x4dc5, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4450, ++ 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x4da2, 0xa87b, 0x0000, ++ 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4450, 0x0510, ++ 0x080c, 0x5f2d, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, ++ 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, ++ 0x080c, 0x4450, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xb54f, ++ 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, ++ 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, ++ 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, ++ 0x308f, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x4da2, ++ 0x001e, 0x1904, 0x308f, 0x0804, 0x305f, 0x00f6, 0x2d78, 0x0011, ++ 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, ++ 0x1000, 0xc0fd, 0x080c, 0x4da2, 0x001e, 0x9085, 0x0001, 0x0005, ++ 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x308f, 0x080c, 0x4dfe, ++ 0x0120, 0x2009, 0x0007, 0x0804, 0x308f, 0x7984, 0x7ea8, 0x96b4, ++ 0x00ff, 0x080c, 0x5c0d, 0x1904, 0x3092, 0x9186, 0x007f, 0x0138, ++ 0x080c, 0x5f2d, 0x0120, 0x2009, 0x0009, 0x0804, 0x308f, 0x080c, ++ 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0xa867, 0x0000, ++ 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, ++ 0xb272, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, ++ 0x701b, 0x4be3, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, ++ 0x2009, 0x0004, 0x0804, 0x308f, 0xa8e0, 0xa866, 0xa810, 0x8007, ++ 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, ++ 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, ++ 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, ++ 0x0804, 0x446b, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x308f, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, ++ 0x1118, 0x701f, 0x1980, 0x0040, 0x92c6, 0x0001, 0x1118, 0x701f, ++ 0x199a, 0x0010, 0x0804, 0x3092, 0x2009, 0x001a, 0x7a8c, 0x7b88, ++ 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, ++ 0x701b, 0x4c33, 0x0005, 0x2001, 0x182c, 0x2003, 0x0001, 0xa85c, ++ 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x701c, ++ 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x305f, 0x080c, 0x441f, ++ 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0x7984, 0x9194, 0xff00, ++ 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1980, 0x0040, ++ 0x92c6, 0x0001, 0x1118, 0x2099, 0x199a, 0x0010, 0x0804, 0x3092, ++ 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, ++ 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x446b, 0x7884, ++ 0x908a, 0x1000, 0x1a04, 0x3092, 0x0126, 0x2091, 0x8000, 0x8003, ++ 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19c7, 0x6146, 0x00ce, ++ 0x012e, 0x0804, 0x305f, 0x00c6, 0x080c, 0x6877, 0x1160, 0x080c, ++ 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x080c, 0x68c0, 0x080c, ++ 0x67be, 0x080c, 0x0d84, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, ++ 0x080c, 0x55a0, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, ++ 0x908e, 0x0000, 0x0904, 0x308f, 0x7884, 0x9005, 0x0188, 0x7888, ++ 0x2061, 0x1969, 0x2c0c, 0x2062, 0x080c, 0x27d7, 0x01a0, 0x080c, ++ 0x27df, 0x0188, 0x080c, 0x27e7, 0x0170, 0x2162, 0x0804, 0x3092, ++ 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, ++ 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1548, 0x2061, ++ 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, 0x0003, 0x080c, ++ 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x002e, 0x080c, 0x8d59, ++ 0x0036, 0x901e, 0x080c, 0x8dfe, 0x003e, 0x60e3, 0x0000, 0x080c, ++ 0xcd0a, 0x080c, 0xcd25, 0x9085, 0x0001, 0x080c, 0x68c0, 0x9006, ++ 0x080c, 0x28a5, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, ++ 0x00ce, 0x0804, 0x305f, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x080c, 0x4dfe, 0x0120, 0x2009, 0x0007, 0x0804, 0x308f, ++ 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x5c0d, 0x1904, 0x3092, ++ 0x9186, 0x007f, 0x0138, 0x080c, 0x5f2d, 0x0120, 0x2009, 0x0009, ++ 0x0804, 0x308f, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb275, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, 0x701b, ++ 0x4d32, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, ++ 0x0804, 0x308f, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, ++ 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, ++ 0x446b, 0xa898, 0x9086, 0x000d, 0x1904, 0x308f, 0x2021, 0x4005, ++ 0x0126, 0x2091, 0x8000, 0x0e04, 0x4d56, 0x0010, 0x012e, 0x0cc0, ++ 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, ++ 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, ++ 0x799e, 0x080c, 0x445b, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, ++ 0xd084, 0x190c, 0x113e, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19c7, 0x7984, ++ 0x6156, 0x6152, 0x605b, 0x0000, 0x604f, 0x0009, 0x7898, 0x606e, ++ 0x789c, 0x606a, 0x7888, 0x6066, 0x788c, 0x6062, 0x2001, 0x19d5, ++ 0x2044, 0x2001, 0x19dd, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, ++ 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, ++ 0x0804, 0x305f, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, ++ 0xc000, 0x0128, 0x0006, 0x080c, 0xb0e3, 0x000e, 0x1198, 0xd0e4, ++ 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x56f3, ++ 0x080c, 0x94d3, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, ++ 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, ++ 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, ++ 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186, 0x007f, ++ 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120, 0x0026, ++ 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x4dcd, 0x015e, ++ 0x012e, 0x0005, 0x2001, 0x1853, 0x2004, 0x0005, 0x2001, 0x1872, ++ 0x2004, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0d4, 0x000e, ++ 0x0005, 0x2001, 0x180d, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, ++ 0x2004, 0x9086, 0x0003, 0x0005, 0x0126, 0x0156, 0x0136, 0x0146, ++ 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, ++ 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, ++ 0x0118, 0x080c, 0x4fa3, 0x0068, 0xd08c, 0x0118, 0x080c, 0x4eb6, ++ 0x0040, 0xd094, 0x0118, 0x080c, 0x4e86, 0x0018, 0xd09c, 0x0108, ++ 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, ++ 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, ++ 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7090, 0x9005, 0x000e, ++ 0x0120, 0x7093, 0x0000, 0x708b, 0x0000, 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, 0x5660, 0x00f0, 0x6040, ++ 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707f, ++ 0x0000, 0x709b, 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, ++ 0x1c80, 0x200b, 0x0000, 0x708f, 0x0000, 0x7083, 0x000f, 0x2009, ++ 0x000f, 0x2011, 0x5546, 0x080c, 0x78a5, 0x0005, 0x2001, 0x1874, ++ 0x2004, 0xd08c, 0x0110, 0x7057, 0xffff, 0x7080, 0x9005, 0x1528, ++ 0x2011, 0x5546, 0x080c, 0x781a, 0x6040, 0x9094, 0x0010, 0x9285, ++ 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, ++ 0x4e9c, 0x6242, 0x7093, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, ++ 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7093, 0x0000, 0x7087, ++ 0x0000, 0x9006, 0x080c, 0x56de, 0x0000, 0x0005, 0x7084, 0x908a, ++ 0x0003, 0x1a0c, 0x0d84, 0x000b, 0x0005, 0x4ec0, 0x4f07, 0x4fa2, ++ 0x00f6, 0x7087, 0x0001, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, ++ 0x9084, 0x00fc, 0x0120, 0x1f04, 0x4ec7, 0x080c, 0x0d84, 0x68a0, ++ 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x6803, 0x1600, ++ 0x6837, 0x0020, 0x080c, 0x56ba, 0x2079, 0x1c00, 0x7833, 0x1101, ++ 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, ++ 0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0x9363, 0x20e1, ++ 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, ++ 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x557c, ++ 0x00fe, 0x9006, 0x708a, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, ++ 0x7088, 0x708b, 0x0000, 0x9025, 0x0904, 0x4f7f, 0x6020, 0xd0b4, ++ 0x1904, 0x4f7d, 0x7198, 0x81ff, 0x0904, 0x4f6b, 0x9486, 0x000c, ++ 0x1904, 0x4f78, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x56b3, ++ 0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, ++ 0x8210, 0x8318, 0x1f04, 0x4f24, 0x6043, 0x0004, 0x2061, 0x0140, ++ 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, ++ 0x7087, 0x0002, 0x7093, 0x0002, 0x2009, 0x07d0, 0x2011, 0x554d, ++ 0x080c, 0x78a5, 0x080c, 0x56ba, 0x04c0, 0x080c, 0x56b3, 0x2079, ++ 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, ++ 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, ++ 0x56b3, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, ++ 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x4f5f, ++ 0x0078, 0x709b, 0x0000, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, ++ 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003, ++ 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, ++ 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x9363, ++ 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, ++ 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19be, 0x2013, ++ 0x0000, 0x708b, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, ++ 0x8b47, 0x08d8, 0x0005, 0x7090, 0x908a, 0x001d, 0x1a0c, 0x0d84, ++ 0x000b, 0x0005, 0x4fd4, 0x4fe7, 0x5010, 0x5030, 0x5056, 0x5085, ++ 0x50ab, 0x50e3, 0x5109, 0x5137, 0x5172, 0x51aa, 0x51c8, 0x51f3, ++ 0x5215, 0x5230, 0x523a, 0x526e, 0x5294, 0x52c3, 0x52e9, 0x5321, ++ 0x5365, 0x53a2, 0x53c3, 0x541c, 0x543e, 0x546c, 0x546c, 0x00c6, ++ 0x2061, 0x1800, 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, 0x554d, 0x080c, 0x78a5, 0x0005, 0x00f6, ++ 0x7088, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, ++ 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, ++ 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, ++ 0x1110, 0x70c3, 0x0001, 0x2011, 0x554d, 0x080c, 0x781a, 0x7093, ++ 0x0010, 0x080c, 0x523a, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, ++ 0x00f6, 0x7093, 0x0003, 0x6043, 0x0004, 0x2011, 0x554d, 0x080c, ++ 0x781a, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, ++ 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, ++ 0x1f04, 0x5025, 0x60c3, 0x0014, 0x080c, 0x557c, 0x00fe, 0x0005, ++ 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, ++ 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, ++ 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, ++ 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0004, ++ 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, 0x00f6, 0x7093, ++ 0x0005, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, ++ 0x0000, 0x080c, 0x56b3, 0x080c, 0x5696, 0x1170, 0x707c, 0x9005, ++ 0x1158, 0x7154, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, ++ 0x54fa, 0x0168, 0x080c, 0x5677, 0x20a9, 0x0008, 0x20e1, 0x0000, ++ 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, ++ 0x0014, 0x080c, 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, ++ 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, ++ 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, ++ 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, ++ 0x1110, 0x70c3, 0x0001, 0x7093, 0x0006, 0x0029, 0x0010, 0x080c, ++ 0x568f, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0007, 0x080c, 0x5642, ++ 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x56b3, ++ 0x080c, 0x5696, 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186, ++ 0xffff, 0x0180, 0x9180, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, ++ 0x2011, 0x0008, 0x080c, 0x54fa, 0x0180, 0x080c, 0x4700, 0x0110, ++ 0x080c, 0x2466, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, ++ 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, ++ 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, ++ 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, ++ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, ++ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, ++ 0x0001, 0x7093, 0x0008, 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, ++ 0x0005, 0x00f6, 0x7093, 0x0009, 0x080c, 0x5642, 0x2079, 0x0240, ++ 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5696, 0x1150, 0x707c, ++ 0x9005, 0x1138, 0x080c, 0x546d, 0x1188, 0x9085, 0x0001, 0x080c, ++ 0x2466, 0x20a9, 0x0008, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, ++ 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, ++ 0x080c, 0x557c, 0x0010, 0x080c, 0x4fc7, 0x00fe, 0x0005, 0x00f6, ++ 0x7088, 0x9005, 0x05a8, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, ++ 0x0014, 0x1560, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, ++ 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 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, 0x5215, 0x0010, 0x080c, 0x568f, ++ 0x00fe, 0x0005, 0x00f6, 0x7093, 0x000b, 0x2011, 0x1c0e, 0x20e9, ++ 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, ++ 0x5642, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, ++ 0x5696, 0x0118, 0x2013, 0x0000, 0x0020, 0x7058, 0x9085, 0x0100, ++ 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, ++ 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, ++ 0x2009, 0x0240, 0x1f04, 0x5197, 0x60c3, 0x0084, 0x080c, 0x557c, ++ 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011, 0x554d, ++ 0x080c, 0x781a, 0x9086, 0x0084, 0x1178, 0x080c, 0x56b3, 0x2079, ++ 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, ++ 0x7093, 0x000c, 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, ++ 0x00f6, 0x7093, 0x000d, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, ++ 0x1107, 0x7837, 0x0000, 0x080c, 0x56b3, 0x20a9, 0x0040, 0x2011, ++ 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, ++ 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, ++ 0x6816, 0x2011, 0x0260, 0x1f04, 0x51db, 0x60c3, 0x0084, 0x080c, ++ 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011, ++ 0x554d, 0x080c, 0x781a, 0x9086, 0x0084, 0x1198, 0x080c, 0x56b3, ++ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, ++ 0x1140, 0x708f, 0x0001, 0x080c, 0x5614, 0x7093, 0x000e, 0x0029, ++ 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, ++ 0x56de, 0x7093, 0x000f, 0x708b, 0x0000, 0x2061, 0x0140, 0x605b, ++ 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, ++ 0x0004, 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x780e, 0x0005, ++ 0x7088, 0x9005, 0x0130, 0x2011, 0x554d, 0x080c, 0x781a, 0x7093, ++ 0x0000, 0x0005, 0x7093, 0x0011, 0x080c, 0x9363, 0x080c, 0x56b3, ++ 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, ++ 0x7488, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, ++ 0x20a8, 0x4003, 0x080c, 0x5696, 0x11a0, 0x7174, 0x81ff, 0x0188, ++ 0x900e, 0x7078, 0x9084, 0x00ff, 0x0160, 0x080c, 0x23fd, 0x9186, ++ 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, ++ 0x54fa, 0x60c3, 0x0014, 0x080c, 0x557c, 0x0005, 0x00f6, 0x7088, ++ 0x9005, 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, ++ 0x11b8, 0x080c, 0x56b3, 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, ++ 0x5650, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, ++ 0x56b3, 0x080c, 0x5696, 0x1170, 0x707c, 0x9005, 0x1158, 0x7154, ++ 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x54fa, 0x0168, ++ 0x080c, 0x5677, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, ++ 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, ++ 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, ++ 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, ++ 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, 0x5650, 0x2079, 0x0240, ++ 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x56b3, 0x080c, 0x5696, ++ 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186, 0xffff, 0x0180, ++ 0x9180, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, ++ 0x080c, 0x54fa, 0x0180, 0x080c, 0x4700, 0x0110, 0x080c, 0x2466, ++ 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, ++ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x557c, 0x00fe, ++ 0x0005, 0x00f6, 0x7088, 0x9005, 0x05f0, 0x2011, 0x554d, 0x080c, ++ 0x781a, 0x9086, 0x0014, 0x15a8, 0x080c, 0x56b3, 0x2079, 0x0260, ++ 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, ++ 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x56de, 0x7a38, ++ 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, ++ 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, ++ 0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x56de, 0x708f, 0x0000, ++ 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7093, 0x0016, 0x0029, ++ 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x080c, 0x9363, 0x080c, ++ 0x56b3, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, ++ 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, ++ 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x7093, 0x0017, ++ 0x080c, 0x5696, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c, 0x546d, ++ 0x1188, 0x9085, 0x0001, 0x080c, 0x2466, 0x20a9, 0x0008, 0x080c, ++ 0x56b3, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, ++ 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x557c, 0x0010, 0x080c, ++ 0x4fc7, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01d8, 0x2011, 0x554d, ++ 0x080c, 0x781a, 0x9086, 0x0084, 0x1190, 0x080c, 0x56b3, 0x2079, ++ 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, ++ 0x9006, 0x080c, 0x56de, 0x7093, 0x0018, 0x0029, 0x0010, 0x708b, ++ 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0019, 0x080c, 0x5650, ++ 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x56b3, ++ 0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, ++ 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, ++ 0x0260, 0x1f04, 0x53d6, 0x2039, 0x1c0e, 0x080c, 0x5696, 0x11e8, ++ 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, ++ 0x00ff, 0x8007, 0x9205, 0x202a, 0x7058, 0x2310, 0x8214, 0x92a0, ++ 0x1c0e, 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, 0x5409, 0x60c3, 0x0084, ++ 0x080c, 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, ++ 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0084, 0x1198, 0x080c, ++ 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, ++ 0x9005, 0x1140, 0x708f, 0x0001, 0x080c, 0x5614, 0x7093, 0x001a, ++ 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, ++ 0x080c, 0x56de, 0x7093, 0x001b, 0x080c, 0x9363, 0x080c, 0x56b3, ++ 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, 0x5455, 0x60c3, ++ 0x0084, 0x080c, 0x557c, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, ++ 0x1853, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, ++ 0x28a0, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, ++ 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, ++ 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, ++ 0x0008, 0x8211, 0x1f04, 0x5487, 0x0804, 0x54f6, 0x82ff, 0x1160, ++ 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, ++ 0x0904, 0x54f6, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, ++ 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, ++ 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, ++ 0x1f04, 0x54ad, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, ++ 0x1f04, 0x54bf, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, ++ 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, ++ 0x1f04, 0x54ce, 0x7556, 0x95c8, 0x2e6e, 0x292d, 0x95ac, 0x00ff, ++ 0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2446, 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, 0x2e6e, 0x242d, 0x95ac, 0x00ff, 0x757a, 0x6532, ++ 0x6536, 0x0016, 0x2508, 0x080c, 0x2446, 0x001e, 0x60e7, 0x0000, ++ 0x65ea, 0x707f, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, ++ 0x1800, 0x7083, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, ++ 0x0100, 0x2071, 0x0140, 0x080c, 0x5603, 0x080c, 0x8b50, 0x7004, ++ 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, ++ 0x080c, 0x28a5, 0x0126, 0x2091, 0x8000, 0x2071, 0x1824, 0x2073, ++ 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5660, ++ 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, ++ 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011, ++ 0x19be, 0x2013, 0x0000, 0x708b, 0x0000, 0x012e, 0x60a3, 0x0056, ++ 0x60a7, 0x9575, 0x080c, 0x8b47, 0x6144, 0xd184, 0x0120, 0x7190, ++ 0x918d, 0x2000, 0x0018, 0x7184, 0x918d, 0x1000, 0x2011, 0x1966, ++ 0x2112, 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x78a5, 0x0005, ++ 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94da, ++ 0x2009, 0x00f7, 0x080c, 0x5660, 0x2061, 0x19c7, 0x900e, 0x611a, ++ 0x611e, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, ++ 0x0090, 0x6043, 0x0010, 0x2009, 0x1966, 0x200b, 0x0000, 0x2009, ++ 0x002d, 0x2011, 0x55ca, 0x080c, 0x780e, 0x012e, 0x00ce, 0x002e, ++ 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0499, ++ 0x2071, 0x0100, 0x080c, 0x8b50, 0x2071, 0x0140, 0x7004, 0x9084, ++ 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x080c, 0x687f, 0x0188, 0x080c, 0x689a, 0x1170, 0x080c, ++ 0x6b4a, 0x0016, 0x080c, 0x2515, 0x2001, 0x193c, 0x2102, 0x001e, ++ 0x080c, 0x6b45, 0x080c, 0x67be, 0x0050, 0x2009, 0x0001, 0x080c, ++ 0x27f5, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, 0x55a0, 0x012e, ++ 0x000e, 0x00ee, 0x0005, 0x2001, 0x180d, 0x2004, 0xd0bc, 0x0158, ++ 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1966, 0x201c, 0x080c, ++ 0x447f, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, ++ 0x20a1, 0x1c80, 0x080c, 0x56b3, 0x20e9, 0x0000, 0x2099, 0x026e, ++ 0x0099, 0x20a9, 0x0020, 0x080c, 0x56ad, 0x2099, 0x0260, 0x20a1, ++ 0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x56b0, 0x2099, 0x0260, ++ 0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, ++ 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5638, 0x002e, ++ 0x001e, 0x0005, 0x080c, 0x9363, 0x20e1, 0x0001, 0x2099, 0x1c00, ++ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, ++ 0x080c, 0x9363, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, 0x0260, ++ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, ++ 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, ++ 0x9005, 0x1138, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x9105, ++ 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, ++ 0x0046, 0x080c, 0x5f29, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, ++ 0x080c, 0xc9c5, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, ++ 0x002a, 0x900e, 0x080c, 0x2ce5, 0x004e, 0x001e, 0x0005, 0x080c, ++ 0x55a0, 0x7093, 0x0000, 0x708b, 0x0000, 0x0005, 0x0006, 0x2001, ++ 0x180c, 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, 0x1c00, 0x4004, 0x2079, 0x1c00, ++ 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, ++ 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, ++ 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x1973, ++ 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, ++ 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, ++ 0x56ed, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, ++ 0x2069, 0x1852, 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707, 0xb80a, ++ 0xb80e, 0xb812, 0x9198, 0x2e6e, 0x231d, 0x939c, 0x00ff, 0xbb16, ++ 0x0016, 0x0026, 0xb8b2, 0x080c, 0x94d3, 0x1120, 0x9192, 0x007e, ++ 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8, 0x9198, ++ 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, ++ 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852, ++ 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, ++ 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, ++ 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, ++ 0x080c, 0x0fe0, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, ++ 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, ++ 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x57c2, ++ 0x9182, 0x0800, 0x1a04, 0x57c6, 0x2001, 0x180c, 0x2004, 0x9084, ++ 0x0003, 0x1904, 0x57cc, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, ++ 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, ++ 0x1904, 0x57de, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, ++ 0xb84e, 0x080c, 0x7be8, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, ++ 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, ++ 0x0005, 0x900e, 0x04b0, 0x2001, 0x0028, 0x900e, 0x0490, 0x9082, ++ 0x0006, 0x1288, 0x080c, 0x94d3, 0x1158, 0xb8a0, 0xd0bc, 0x1140, ++ 0xb900, 0xd1fc, 0x0998, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, ++ 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, ++ 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, ++ 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, ++ 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, ++ 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, ++ 0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, 0x5f2d, ++ 0x1990, 0xb800, 0xd0c4, 0x0978, 0x0804, 0x5776, 0x080c, 0x5da9, ++ 0x0904, 0x578f, 0x0804, 0x577a, 0x00b6, 0x00e6, 0x0126, 0x2091, ++ 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x583f, 0x9188, 0x1000, ++ 0x2104, 0x905d, 0x0528, 0xb8a0, 0x9086, 0x007f, 0x0130, 0x080c, ++ 0x5f35, 0x0118, 0x080c, 0x5f2d, 0x11f0, 0xa87c, 0xd0fc, 0x0138, ++ 0xa894, 0x9005, 0x0120, 0x2060, 0x2900, 0x6016, 0x0058, 0x080c, ++ 0x94fe, 0x05e0, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, ++ 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x95ce, 0x9006, 0x0450, ++ 0x2001, 0x0028, 0x0430, 0x9082, 0x0006, 0x1288, 0x080c, 0x94d3, ++ 0x1158, 0xb8a0, 0xd0bc, 0x1140, 0xb900, 0xd1fc, 0x09b0, 0x2001, ++ 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, ++ 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, ++ 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, ++ 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, ++ 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, ++ 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, ++ 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, ++ 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, ++ 0xa878, 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, 0x00be, 0x00fe, ++ 0x0005, 0x58d5, 0x5891, 0x58a7, 0x58d5, 0x58d5, 0x58d5, 0x58d5, ++ 0x58d5, 0x2100, 0x9082, 0x007e, 0x1270, 0x080c, 0x5bb0, 0x0140, ++ 0xb810, 0x9306, 0x1904, 0x58dd, 0xb814, 0x9206, 0x15f0, 0x0028, ++ 0xbb12, 0xba16, 0x0010, 0x080c, 0x435a, 0x0150, 0x04b0, 0x080c, ++ 0x5c0d, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, ++ 0x080c, 0x94fe, 0x0530, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x2900, ++ 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, ++ 0x1170, 0x080c, 0x2d1a, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, ++ 0x080c, 0x5b61, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, ++ 0x0003, 0x080c, 0x95ce, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, ++ 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, ++ 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, ++ 0x5aa6, 0x90c6, 0x0056, 0x0904, 0x5aaa, 0x90c6, 0x0066, 0x0904, ++ 0x5aae, 0x90c6, 0x0071, 0x0904, 0x5ab2, 0x90c6, 0x0074, 0x0904, ++ 0x5ab6, 0x90c6, 0x007c, 0x0904, 0x5aba, 0x90c6, 0x007e, 0x0904, ++ 0x5abe, 0x90c6, 0x0037, 0x0904, 0x5ac2, 0x9016, 0x2079, 0x1800, ++ 0xa974, 0x9186, 0x00ff, 0x0904, 0x5aa1, 0x9182, 0x0800, 0x1a04, ++ 0x5aa1, 0x080c, 0x5c0d, 0x1190, 0xb804, 0x9084, 0x00ff, 0x9082, ++ 0x0006, 0x1260, 0xa894, 0x90c6, 0x006f, 0x0140, 0x080c, 0x94d3, ++ 0x1904, 0x5a8a, 0xb8a0, 0xd0bc, 0x1904, 0x5a8a, 0xa894, 0x90c6, ++ 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x59e6, 0x90c6, 0x0064, ++ 0x0904, 0x5a12, 0x2008, 0x0804, 0x59a8, 0xa998, 0xa8b0, 0x2040, ++ 0x080c, 0x94d3, 0x1120, 0x9182, 0x007f, 0x0a04, 0x59a8, 0x9186, ++ 0x00ff, 0x0904, 0x59a8, 0x9182, 0x0800, 0x1a04, 0x59a8, 0xaaa0, ++ 0xab9c, 0x7874, 0x9306, 0x1188, 0x7878, 0x0096, 0x924e, 0x1128, ++ 0x2208, 0x2310, 0x009e, 0x0804, 0x59a8, 0x99cc, 0xff00, 0x009e, ++ 0x1120, 0x2208, 0x2310, 0x0804, 0x59a8, 0x080c, 0x435a, 0x0904, ++ 0x59b2, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c, ++ 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, ++ 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, ++ 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f2b, 0x20a9, ++ 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4, ++ 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, 0x000e, ++ 0x0098, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0070, 0x90c6, 0x4008, ++ 0x1118, 0x2708, 0x2610, 0x0040, 0x90c6, 0x4009, 0x1108, 0x0020, ++ 0x2001, 0x4005, 0x2009, 0x000a, 0xa896, 0xa99a, 0xaa9e, 0x2001, ++ 0x0030, 0x0470, 0x080c, 0x94fe, 0x1130, 0x2001, 0x4005, 0x2009, ++ 0x0003, 0x9016, 0x0c88, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x2900, ++ 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x2d1a, 0x012e, 0x9006, 0x080c, ++ 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, 0x2009, 0x0002, 0x080c, ++ 0x95ce, 0xa8b0, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x9006, ++ 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x4dfe, ++ 0x0118, 0x2009, 0x0007, 0x0410, 0xa998, 0xaeb0, 0x080c, 0x5c0d, ++ 0x0120, 0x2009, 0x000a, 0x0804, 0x59a8, 0x9186, 0x007f, 0x0130, ++ 0x080c, 0x5f2d, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, ++ 0x0fae, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, ++ 0xa806, 0x080c, 0xb275, 0x1998, 0x2009, 0x0003, 0x2001, 0x4005, ++ 0x0804, 0x59ac, 0xa998, 0xaeb0, 0x080c, 0x5c0d, 0x0120, 0x2009, ++ 0x000a, 0x0804, 0x59a8, 0x0096, 0x080c, 0x0fae, 0x1128, 0x009e, ++ 0x2009, 0x0002, 0x0804, 0x5a69, 0x2900, 0x009e, 0xa806, 0x0096, ++ 0x2048, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, ++ 0x9080, 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c, ++ 0x0f2b, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, ++ 0xd684, 0x1168, 0x080c, 0x4dea, 0xd0b4, 0x1118, 0xa89b, 0x000b, ++ 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, ++ 0x5f2d, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x4dfe, 0x0118, ++ 0xa89b, 0x0007, 0x0050, 0x080c, 0xb258, 0x1904, 0x59df, 0x2009, ++ 0x0003, 0x2001, 0x4005, 0x0804, 0x59ac, 0xa87b, 0x0030, 0xa897, ++ 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, ++ 0xffc0, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, ++ 0x0000, 0x2041, 0x11e3, 0x080c, 0x9a1f, 0x1904, 0x59df, 0x2009, ++ 0x0002, 0x08f8, 0x2001, 0x0028, 0x900e, 0x0804, 0x59e0, 0x2009, ++ 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, ++ 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, ++ 0x59e0, 0x2001, 0x0029, 0x900e, 0x0804, 0x59e0, 0x080c, 0x327f, ++ 0x0804, 0x59e1, 0x080c, 0x4b29, 0x0804, 0x59e1, 0x080c, 0x3fec, ++ 0x0804, 0x59e1, 0x080c, 0x43f5, 0x0804, 0x59e1, 0x080c, 0x4572, ++ 0x0804, 0x59e1, 0x080c, 0x4796, 0x0804, 0x59e1, 0x080c, 0x499b, ++ 0x0804, 0x59e1, 0x080c, 0x3459, 0x0804, 0x59e1, 0x00b6, 0xa974, ++ 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, ++ 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x5f2d, ++ 0x1148, 0x00e9, 0x080c, 0x5d38, 0x9006, 0x00b0, 0x2001, 0x0028, ++ 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d88, ++ 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, ++ 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, 0x2148, ++ 0xa802, 0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, 0x2900, ++ 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, ++ 0xb84c, 0x9005, 0x0170, 0x00e6, 0x2071, 0x19b4, 0x7004, 0x9086, ++ 0x0002, 0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, 0x012e, ++ 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x701c, ++ 0x9b06, 0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, 0x2900, ++ 0xb002, 0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e, ++ 0x9905, 0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, ++ 0x1108, 0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, 0x00c6, ++ 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, ++ 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, ++ 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, ++ 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, ++ 0x080c, 0x5f29, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, ++ 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, ++ 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d84, ++ 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, ++ 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, ++ 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x5f25, 0x1138, 0x9284, ++ 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, ++ 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, ++ 0x00d6, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x00b0, ++ 0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x0fae, ++ 0x2958, 0x009e, 0x0d90, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, ++ 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x56f3, 0x9006, 0x002e, 0x00de, ++ 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, ++ 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, ++ 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, ++ 0x080c, 0x0fe0, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, 0x0168, ++ 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0110, 0x080c, ++ 0x0f60, 0x080c, 0x9554, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48, ++ 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x0ff0, 0x00de, 0x9006, ++ 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800, ++ 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d, ++ 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, ++ 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x6877, ++ 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x94d3, 0x11d8, ++ 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x194f, 0x7048, ++ 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, ++ 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, ++ 0x2069, 0x1800, 0x68ae, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, ++ 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8, 0xb8b8, ++ 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a, ++ 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200, ++ 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872, ++ 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086, ++ 0x007e, 0x1110, 0x7144, 0xb96e, 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, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, ++ 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c, ++ 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbbc, 0xc384, 0xba00, 0x2009, ++ 0x1872, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, ++ 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, ++ 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbbe, 0x003e, ++ 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, ++ 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282, ++ 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006, ++ 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004, ++ 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff, ++ 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d84, 0x3c00, 0x20e8, 0x3300, ++ 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, ++ 0x013e, 0x0060, 0x080c, 0x0fae, 0x0170, 0x2900, 0xb8a6, 0xa803, ++ 0x0000, 0x080c, 0x5dc9, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, ++ 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, ++ 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, ++ 0x5dd8, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, ++ 0x0020, 0x080c, 0x0fe0, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x7be8, 0x012e, 0x0005, 0x901e, ++ 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, 0xb84c, ++ 0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, 0x0120, ++ 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, ++ 0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, 0x8eec, ++ 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150, ++ 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005, ++ 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x5e2d, ++ 0x0118, 0x080c, 0xb15e, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, ++ 0x5e2d, 0x0118, 0x080c, 0xb0f8, 0x0010, 0x9085, 0x0001, 0x0005, ++ 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb15b, 0x0010, 0x9085, 0x0001, ++ 0x0005, 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb11c, 0x0010, 0x9085, ++ 0x0001, 0x0005, 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb188, 0x0010, ++ 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, ++ 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, ++ 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, ++ 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, ++ 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, ++ 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, ++ 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, ++ 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, ++ 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, ++ 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, ++ 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, ++ 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, ++ 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, ++ 0xb8a4, 0x904d, 0x1128, 0x080c, 0x0fae, 0x0168, 0x2900, 0xb8a6, ++ 0x080c, 0x5dc9, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, ++ 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, ++ 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x0fe0, ++ 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, ++ 0x00b6, 0x00f6, 0x080c, 0x6877, 0x01b0, 0x71c0, 0x81ff, 0x1198, ++ 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, ++ 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, ++ 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1852, 0x7804, 0xd0a4, 0x01d0, ++ 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5c0d, 0x1168, ++ 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, ++ 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, ++ 0x5e54, 0x015e, 0x080c, 0x5eeb, 0x0120, 0x2001, 0x1952, 0x200c, ++ 0x0038, 0x2079, 0x1852, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, ++ 0x2011, 0x5e7f, 0x080c, 0x78a5, 0x00fe, 0x00be, 0x0005, 0x00b6, ++ 0x2011, 0x5e7f, 0x080c, 0x781a, 0x080c, 0x5eeb, 0x01d8, 0x2001, ++ 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x5f29, ++ 0x0130, 0x2009, 0x07d0, 0x2011, 0x5e7f, 0x080c, 0x78a5, 0x00e6, ++ 0x2071, 0x1800, 0x9006, 0x7076, 0x7058, 0x707a, 0x080c, 0x2b1e, ++ 0x00ee, 0x0488, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, ++ 0x080c, 0x5c0d, 0x1510, 0xb800, 0xd0ec, 0x01f8, 0x0046, 0xbaa0, ++ 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xc9c5, 0xb800, 0xc0e5, ++ 0xc0ec, 0xb802, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, ++ 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x903e, 0x080c, 0x7c4d, ++ 0x900e, 0x080c, 0xc73e, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, ++ 0x5ea7, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, ++ 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, ++ 0xb800, 0x00be, 0xd0ac, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, ++ 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, ++ 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, ++ 0x9b06, 0x190c, 0x0d84, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, ++ 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, ++ 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1950, 0x200c, 0x2011, 0x5f1b, ++ 0x080c, 0x78a5, 0x0005, 0x2011, 0x5f1b, 0x080c, 0x781a, 0x2011, ++ 0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x4dea, 0xd0ac, ++ 0x0005, 0x080c, 0x4dea, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, ++ 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, ++ 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, ++ 0x080c, 0xb759, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, ++ 0x107f, 0x2004, 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, ++ 0x0005, 0x2071, 0x1904, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, ++ 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1917, ++ 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1918, 0x900e, ++ 0x710a, 0x080c, 0x4dea, 0xd0fc, 0x1140, 0x080c, 0x4dea, 0x900e, ++ 0xd09c, 0x0108, 0x8108, 0x7102, 0x00f8, 0x2001, 0x1872, 0x200c, ++ 0x9184, 0x0007, 0x0002, 0x5f6d, 0x5f6d, 0x5f6d, 0x5f6d, 0x5f6d, ++ 0x5f83, 0x5f91, 0x5f6d, 0x7003, 0x0003, 0x2009, 0x1873, 0x210c, ++ 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, ++ 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, ++ 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1904, ++ 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, ++ 0x9005, 0x0158, 0x080c, 0x6bb2, 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, 0x1904, 0x7028, ++ 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, ++ 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11c8, 0x00e6, 0x0026, 0x2001, ++ 0x1918, 0x2004, 0x9005, 0x0904, 0x61ae, 0xa87c, 0xd0bc, 0x1904, ++ 0x61ae, 0xa978, 0xa874, 0x9105, 0x1904, 0x61ae, 0x2001, 0x1918, ++ 0x2004, 0x0002, 0x61ae, 0x6017, 0x6051, 0x6051, 0x0005, 0xa868, ++ 0xd0fc, 0x11e0, 0x00e6, 0x0026, 0x2009, 0x1918, 0x210c, 0x81ff, ++ 0x0904, 0x61ae, 0xa87c, 0xd0cc, 0x0904, 0x61ae, 0xa880, 0x9084, ++ 0x00ff, 0x9086, 0x0001, 0x1904, 0x61ae, 0x9186, 0x0003, 0x0904, ++ 0x6051, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, ++ 0x8020, 0xa853, 0x0016, 0x2071, 0x1904, 0x701c, 0x9005, 0x1904, ++ 0x6360, 0x0e04, 0x63a9, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, ++ 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1800, ++ 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1148, 0xa802, 0x2900, ++ 0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0096, ++ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, ++ 0x0c68, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1904, ++ 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6136, 0x782c, 0x908c, ++ 0x0780, 0x190c, 0x64ce, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, ++ 0x0002, 0x606f, 0x6136, 0x6092, 0x60d5, 0x080c, 0x0d84, 0x2071, ++ 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c7, ++ 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, ++ 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, ++ 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, ++ 0x70be, 0x0c20, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, ++ 0x1570, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, ++ 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, ++ 0x0048, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, ++ 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, ++ 0x1d00, 0x2071, 0x19c7, 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, ++ 0x2004, 0x8005, 0x7042, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, ++ 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, ++ 0x702e, 0x70bc, 0x9200, 0x70be, 0x0820, 0x0096, 0x00e6, 0x7824, ++ 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, ++ 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, ++ 0x1d70, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, ++ 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, ++ 0x19c7, 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, ++ 0x7042, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, ++ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, ++ 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c7, 0x7040, ++ 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, 0x00fe, ++ 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, ++ 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, ++ 0x9200, 0x70be, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, ++ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, ++ 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6189, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, ++ 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, ++ 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, 0x0d68, ++ 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x01a0, 0x00e6, ++ 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, ++ 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, ++ 0xd0a4, 0x1d70, 0x00ee, 0x2071, 0x19c7, 0x7040, 0x9005, 0x1328, ++ 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, 0x00fe, 0x002e, 0x00ee, ++ 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, ++ 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, ++ 0x70be, 0x00ee, 0x0804, 0x6146, 0xa868, 0xd0fc, 0x1904, 0x61ea, ++ 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0f60, 0x009e, ++ 0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, 0x0026, 0xa84f, 0x0000, ++ 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70f0, 0x8001, 0x01d0, ++ 0x1678, 0x2071, 0x1904, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, ++ 0x62de, 0x782c, 0x908c, 0x0780, 0x190c, 0x64ce, 0x8004, 0x8004, ++ 0x8004, 0x9084, 0x0003, 0x0002, 0x61eb, 0x62de, 0x6204, 0x6271, ++ 0x080c, 0x0d84, 0x70f3, 0x0fa0, 0x71ec, 0x8107, 0x9106, 0x9094, ++ 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70ee, 0x3b08, 0x3a00, 0x9104, ++ 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x0888, ++ 0x70f2, 0x0878, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, ++ 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, ++ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, ++ 0x70bc, 0x9200, 0x70be, 0x0c70, 0x2071, 0x1800, 0x2900, 0x7822, ++ 0xa804, 0x900d, 0x1904, 0x6262, 0x7830, 0x8007, 0x9084, 0x001f, ++ 0x9082, 0x0005, 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, ++ 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f, ++ 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0048, 0x00ee, ++ 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, ++ 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d00, 0x0e04, ++ 0x6259, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, ++ 0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1915, 0x200c, 0xc184, ++ 0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, ++ 0x113e, 0x2009, 0x1917, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, ++ 0x0005, 0x2001, 0x1915, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, ++ 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, ++ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0804, ++ 0x6217, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, ++ 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d70, 0x00ee, 0x0e04, 0x62b3, ++ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, ++ 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, ++ 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, ++ 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe, ++ 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e, ++ 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, ++ 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe, ++ 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, ++ 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, ++ 0x9200, 0x70be, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, ++ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, ++ 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x634d, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd09c, 0x11b0, 0x701c, 0x904d, 0x0198, ++ 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, ++ 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, ++ 0x64ce, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, ++ 0xd0a4, 0x05b8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, ++ 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d70, 0x00ee, 0x0e04, 0x6346, ++ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, ++ 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, ++ 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, ++ 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, ++ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, ++ 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x00ee, 0x0804, 0x62ee, ++ 0x2071, 0x1904, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, ++ 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, ++ 0xa804, 0x900d, 0x1128, 0x1e04, 0x6389, 0x002e, 0x00ee, 0x0005, ++ 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, ++ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0e04, ++ 0x6375, 0x2071, 0x1904, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d28, ++ 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, ++ 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, ++ 0x190c, 0x113e, 0x2071, 0x1904, 0x080c, 0x64ba, 0x002e, 0x00ee, ++ 0x0005, 0x2071, 0x1904, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, ++ 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, ++ 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, ++ 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, ++ 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, ++ 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, ++ 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, ++ 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, ++ 0x2071, 0x1904, 0x7004, 0x0002, 0x63f2, 0x63f3, 0x64b9, 0x63f3, ++ 0x0d84, 0x64b9, 0x0005, 0x2001, 0x1918, 0x2004, 0x0002, 0x63fd, ++ 0x63fd, 0x6452, 0x6453, 0x63fd, 0x6453, 0x0126, 0x2091, 0x8000, ++ 0x1e0c, 0x64d9, 0x701c, 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8, ++ 0x0e04, 0x6421, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, ++ 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, ++ 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1904, 0x080c, ++ 0x64ba, 0x012e, 0x0470, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, ++ 0x190c, 0x64ce, 0xd09c, 0x2071, 0x1904, 0x1510, 0x2071, 0x1904, ++ 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, ++ 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, ++ 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1904, 0x701c, 0x2048, ++ 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, ++ 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19c7, 0x6840, ++ 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1813, ++ 0x2004, 0x2009, 0x1a8a, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091, ++ 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04, ++ 0x6485, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883, ++ 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, ++ 0x113e, 0x2069, 0x19c7, 0x6843, 0xffff, 0x012e, 0x00de, 0x0126, ++ 0x2091, 0x8000, 0x1e0c, 0x654b, 0x701c, 0x904d, 0x0540, 0x2001, ++ 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071, ++ 0x1904, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, ++ 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, ++ 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048, 0x7010, ++ 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, ++ 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d, 0x0160, ++ 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, ++ 0x012e, 0x080c, 0x0fe0, 0x0005, 0x012e, 0x0005, 0x2091, 0x8000, ++ 0x0e04, 0x64d0, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, 0x0804, ++ 0x0d8d, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01e0, ++ 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, ++ 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, ++ 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, 0x200b, ++ 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780, 0x1971, ++ 0xd0a4, 0x0db8, 0x2001, 0x1918, 0x2004, 0x2009, 0x1917, 0x2104, ++ 0x8000, 0x200a, 0x9082, 0x000f, 0x0e60, 0x00e6, 0x2071, 0x1800, ++ 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, ++ 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0048, ++ 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, ++ 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d00, ++ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, ++ 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, ++ 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, 0x200b, 0x0000, 0x00ee, ++ 0x00fe, 0x009e, 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, 0x113e, 0x00fe, 0x0005, ++ 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x0db8, 0x00e6, ++ 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, ++ 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, ++ 0xd0a4, 0x1d80, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x1918, ++ 0x6808, 0x690a, 0x2069, 0x19c7, 0x9102, 0x1118, 0x6840, 0x9005, ++ 0x1328, 0x2001, 0x1919, 0x200c, 0x810d, 0x6942, 0x00de, 0x00ee, ++ 0x00fe, 0x0005, 0x7090, 0x908a, 0x0029, 0x1a0c, 0x0d84, 0x9082, ++ 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x666d, 0x65f7, 0x6613, ++ 0x663b, 0x665c, 0x669c, 0x66ae, 0x6613, 0x6684, 0x65b2, 0x65e0, ++ 0x65b1, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, ++ 0x6808, 0x9005, 0x1518, 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, ++ 0x7002, 0x080c, 0x69a3, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, ++ 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, 0x7002, 0x6028, 0x9085, ++ 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a30, ++ 0x080c, 0x1827, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, ++ 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, ++ 0x1160, 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, 0x7002, 0x080c, ++ 0x6a2d, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, ++ 0x2001, 0x0090, 0x080c, 0x28a5, 0x000e, 0x6124, 0xd1e4, 0x1190, ++ 0x080c, 0x671b, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, ++ 0x7093, 0x0020, 0x080c, 0x671b, 0x0028, 0x7093, 0x001d, 0x0010, ++ 0x7093, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x28a5, 0x6124, ++ 0xd1cc, 0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, ++ 0x11c8, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x68a3, ++ 0x2001, 0x0080, 0x080c, 0x28a5, 0x7093, 0x0028, 0x0058, 0x7093, ++ 0x001e, 0x0040, 0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010, ++ 0x7093, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, ++ 0x080c, 0x68a3, 0x2001, 0x0080, 0x080c, 0x28a5, 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, 0x28a5, ++ 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1851, 0x7093, ++ 0x001e, 0x0010, 0x7093, 0x001d, 0x0005, 0x080c, 0x6794, 0x6124, ++ 0xd1dc, 0x1188, 0x080c, 0x671b, 0x0016, 0x080c, 0x1851, 0x001e, ++ 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x7093, 0x001e, 0x0020, 0x7093, ++ 0x001f, 0x080c, 0x671b, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, ++ 0x28a5, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, ++ 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, ++ 0x0010, 0x7093, 0x0021, 0x0005, 0x080c, 0x6794, 0x6124, 0xd1d4, ++ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, ++ 0x7093, 0x001d, 0x0010, 0x7093, 0x001f, 0x0005, 0x0006, 0x2001, ++ 0x0090, 0x080c, 0x28a5, 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, 0x1800, 0x2091, 0x8000, 0x080c, 0x6877, ++ 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102, ++ 0x6027, 0x0200, 0x080c, 0x27ef, 0x6024, 0xd0cc, 0x0148, 0x2001, ++ 0x00a0, 0x080c, 0x28a5, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x0428, ++ 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6891, 0x0150, 0x080c, ++ 0x6888, 0x1138, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, 0x6853, ++ 0x00a0, 0x080c, 0x6791, 0x0178, 0x2001, 0x0001, 0x080c, 0x23a6, ++ 0x7090, 0x9086, 0x001e, 0x0120, 0x7090, 0x9086, 0x0022, 0x1118, ++ 0x7093, 0x0025, 0x0010, 0x7093, 0x0021, 0x012e, 0x00ee, 0x00de, ++ 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x672c, 0x080c, 0x78e7, ++ 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x672c, 0x080c, ++ 0x78de, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, ++ 0x8b50, 0x2071, 0x1800, 0x080c, 0x66c9, 0x001e, 0x00fe, 0x00ee, ++ 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, ++ 0x0126, 0x080c, 0x8b50, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, ++ 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, ++ 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, 0x8d59, ++ 0x080c, 0x7893, 0x0036, 0x901e, 0x080c, 0x8dfe, 0x003e, 0x60e3, ++ 0x0000, 0x080c, 0xcd0a, 0x080c, 0xcd25, 0x2009, 0x0004, 0x080c, ++ 0x27f5, 0x080c, 0x2718, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, ++ 0x0008, 0x080c, 0x0b69, 0x2001, 0x0001, 0x080c, 0x23a6, 0x012e, ++ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, ++ 0x0026, 0x00e6, 0x2011, 0x6739, 0x2071, 0x19c7, 0x701c, 0x9206, ++ 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, ++ 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, ++ 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x28a5, 0x0156, 0x20a9, ++ 0x002d, 0x1d04, 0x67a1, 0x2091, 0x6000, 0x1f04, 0x67a1, 0x015e, ++ 0x00d6, 0x2069, 0x1800, 0x6894, 0x8001, 0x0220, 0x0118, 0x6896, ++ 0x00de, 0x0005, 0x6897, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, 0x6800, ++ 0x9086, 0x0001, 0x1da8, 0x080c, 0x78f3, 0x0c90, 0x00c6, 0x00d6, ++ 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, ++ 0x194c, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, ++ 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6843, ++ 0x7093, 0x0022, 0x0040, 0x7093, 0x0021, 0x0028, 0x7093, 0x0023, ++ 0x0010, 0x7093, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, ++ 0x0001, 0x080c, 0x2471, 0x0026, 0x080c, 0x94da, 0x002e, 0x7000, ++ 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, ++ 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, ++ 0x0120, 0x012e, 0x015e, 0x0804, 0x684f, 0x6800, 0x9084, 0x00a1, ++ 0xc0bd, 0x6802, 0x080c, 0x27ef, 0x6904, 0xd1d4, 0x1140, 0x2001, ++ 0x0100, 0x080c, 0x28a5, 0x1f04, 0x67fe, 0x080c, 0x68d0, 0x012e, ++ 0x015e, 0x080c, 0x6888, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, ++ 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x68d0, 0x9006, 0x8001, ++ 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, ++ 0x68d0, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, ++ 0x00c8, 0x2011, 0x6739, 0x080c, 0x78a5, 0x002e, 0x001e, 0x2001, ++ 0x194c, 0x2003, 0x0004, 0x080c, 0x659a, 0x080c, 0x6888, 0x0138, ++ 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x6b45, 0x00ee, ++ 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, ++ 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x6b4f, 0x2001, 0x193c, ++ 0x2003, 0x0000, 0x9006, 0x7092, 0x60e2, 0x6886, 0x080c, 0x2471, ++ 0x9006, 0x080c, 0x28a5, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, ++ 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, ++ 0x2001, 0x194b, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, ++ 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, ++ 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, ++ 0x0005, 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0010, ++ 0x000e, 0x0005, 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, ++ 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, ++ 0x908c, 0x0013, 0x0190, 0x9084, 0x0011, 0x0120, 0x080c, 0x2491, ++ 0x900e, 0x0028, 0x080c, 0x5f25, 0x1dc8, 0x2009, 0x0002, 0x2019, ++ 0x0028, 0x080c, 0x2ce5, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, ++ 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xb752, 0x1128, ++ 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, 0x68e5, 0x2091, ++ 0x6000, 0x1f04, 0x68e5, 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, 0x2471, 0x2001, 0x00a0, 0x080c, 0x28a5, 0x000e, ++ 0x6052, 0x6058, 0x0006, 0xc0e5, 0x605a, 0x00f6, 0x2079, 0x0100, ++ 0x080c, 0x2764, 0x00fe, 0x000e, 0x605a, 0x0005, 0x0156, 0x0016, ++ 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, ++ 0x0140, 0x2071, 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, ++ 0x180c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x6996, 0x2001, 0x180c, ++ 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, ++ 0x0200, 0x2001, 0x0090, 0x080c, 0x28a5, 0x20a9, 0x0366, 0x6024, ++ 0xd0cc, 0x11f0, 0x1d04, 0x6947, 0x2091, 0x6000, 0x1f04, 0x6947, ++ 0x2011, 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, ++ 0x080c, 0x8d59, 0x901e, 0x080c, 0x8dfe, 0x2001, 0x00a0, 0x080c, ++ 0x28a5, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x0470, ++ 0x86ff, 0x1110, 0x080c, 0x1851, 0x60e3, 0x0000, 0x2001, 0x193c, ++ 0x2004, 0x080c, 0x2471, 0x60e2, 0x2001, 0x0080, 0x080c, 0x28a5, ++ 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x27ef, ++ 0x6024, 0x910c, 0x0138, 0x1d04, 0x697a, 0x2091, 0x6000, 0x1f04, ++ 0x697a, 0x0830, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70ac, 0x9005, ++ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x9006, 0x080c, 0xb759, ++ 0x0110, 0x080c, 0x0cfc, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, ++ 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, ++ 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x2069, 0x0140, ++ 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x69f7, ++ 0x2001, 0x0088, 0x080c, 0x28a5, 0x9006, 0x60e2, 0x6886, 0x080c, ++ 0x2471, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, ++ 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, ++ 0x195c, 0x7000, 0x206a, 0x7093, 0x0026, 0x7003, 0x0001, 0x20a9, ++ 0x0002, 0x1d04, 0x69d9, 0x2091, 0x6000, 0x1f04, 0x69d9, 0x0804, ++ 0x6a25, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, ++ 0x1e00, 0x080c, 0x27ef, 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00, ++ 0x11f0, 0x1d04, 0x69e5, 0x2091, 0x6000, 0x1f04, 0x69e5, 0x2011, ++ 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, ++ 0x8d59, 0x901e, 0x080c, 0x8dfe, 0x2001, 0x00a0, 0x080c, 0x28a5, ++ 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x00b0, 0x2001, ++ 0x0080, 0x080c, 0x28a5, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, ++ 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x193c, ++ 0x2004, 0x080c, 0x2471, 0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, ++ 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, ++ 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, ++ 0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003, 0x080c, 0x8e99, ++ 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, 0x8d59, 0x901e, 0x080c, ++ 0x8dfe, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x28a5, 0x080c, ++ 0x6b40, 0x080c, 0x56d9, 0x0804, 0x6ac0, 0x2001, 0x180c, 0x200c, ++ 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6721, 0x2069, 0x0140, ++ 0x2001, 0x0080, 0x080c, 0x28a5, 0x60e3, 0x0000, 0x2069, 0x0200, ++ 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084, ++ 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x195c, 0x7000, 0x206a, ++ 0x7093, 0x0027, 0x7003, 0x0001, 0x0804, 0x6ac0, 0x6027, 0x1e00, ++ 0x2009, 0x1e00, 0x080c, 0x27ef, 0x6024, 0x910c, 0x01c8, 0x9084, ++ 0x1c00, 0x11b0, 0x1d04, 0x6a7e, 0x0006, 0x0016, 0x00c6, 0x00d6, ++ 0x00e6, 0x080c, 0x7778, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, ++ 0x00e6, 0x2071, 0x19c7, 0x7018, 0x00ee, 0x9005, 0x19f8, 0x0500, ++ 0x0026, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c, ++ 0x78e7, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, 0x9005, ++ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x193c, 0x2004, ++ 0x080c, 0x2471, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102, ++ 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, ++ 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, ++ 0x0100, 0x2071, 0x1800, 0x080c, 0xb752, 0x1904, 0x6b2e, 0x7130, ++ 0xd184, 0x1170, 0x080c, 0x2e69, 0x0138, 0xc18d, 0x7132, 0x2011, ++ 0x1853, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x6b2e, ++ 0x2011, 0x1853, 0x220c, 0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e, ++ 0x080c, 0xc941, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, ++ 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x5c0d, 0x1170, ++ 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc9c5, 0x2009, ++ 0x0001, 0x2011, 0x0100, 0x080c, 0x7a0a, 0x001e, 0x8108, 0x1f04, ++ 0x6af7, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, ++ 0x0002, 0x2019, 0x0004, 0x080c, 0x2ce5, 0x001e, 0x0078, 0x0156, ++ 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5c0d, 0x1110, 0x080c, ++ 0x56f3, 0x8108, 0x1f04, 0x6b24, 0x00be, 0x015e, 0x080c, 0x1851, ++ 0x080c, 0x94da, 0x60e3, 0x0000, 0x080c, 0x56d9, 0x080c, 0x67be, ++ 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, ++ 0x2001, 0x194c, 0x2003, 0x0001, 0x0005, 0x2001, 0x194c, 0x2003, ++ 0x0000, 0x0005, 0x2001, 0x194b, 0x2003, 0xaaaa, 0x0005, 0x2001, ++ 0x194b, 0x2003, 0x0000, 0x0005, 0x2071, 0x18ee, 0x7003, 0x0000, ++ 0x7007, 0x0000, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0xa8ab, 0xdcb0, ++ 0x2900, 0x704e, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0xa8ab, 0xdcb0, ++ 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, ++ 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085, ++ 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 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, 0x18ee, 0x6807, 0x0001, 0x00de, 0x080c, 0x70f9, 0x9006, ++ 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, ++ 0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, ++ 0x3e08, 0x1f04, 0x6bb6, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, ++ 0x18ee, 0x7004, 0x0002, 0x6bd5, 0x6bd6, 0x6c0b, 0x6c66, 0x6d61, ++ 0x6bd3, 0x6bd3, 0x6d8b, 0x080c, 0x0d84, 0x0005, 0x2079, 0x0040, ++ 0x782c, 0x908c, 0x0780, 0x190c, 0x7185, 0xd0a4, 0x01f0, 0x7824, ++ 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, ++ 0x0040, 0x12c0, 0x04db, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, ++ 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, ++ 0x9186, 0x0003, 0x19e8, 0x080c, 0x6c66, 0x782c, 0xd09c, 0x090c, ++ 0x70f9, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x002b, 0x0c18, ++ 0x080c, 0x6c9c, 0x0c90, 0x0005, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6cbe, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6ca8, 0x6c9c, 0x6e60, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6ca8, 0x6ea1, 0x6ee2, 0x6f29, 0x6f3d, 0x6c9c, 0x6c9c, 0x6cbe, ++ 0x6ca8, 0x6c9c, 0x6c9c, 0x6d35, 0x6fe8, 0x7003, 0x6c9c, 0x6cbe, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6d2b, 0x7003, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6cd2, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x7129, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6ce6, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x2079, 0x0040, ++ 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x7122, 0xd0a4, ++ 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, ++ 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, ++ 0x70f9, 0x0005, 0x6c9c, 0x6ca8, 0x6e4c, 0x6c9c, 0x6ca8, 0x6c9c, ++ 0x6ca8, 0x6ca8, 0x6c9c, 0x6ca8, 0x6e4c, 0x6ca8, 0x6ca8, 0x6ca8, ++ 0x6ca8, 0x6ca8, 0x6c9c, 0x6ca8, 0x6e4c, 0x6c9c, 0x6c9c, 0x6ca8, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6ca8, 0x00e6, 0x2071, 0x18ee, 0x2009, ++ 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, ++ 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, ++ 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x0005, 0xa864, 0x8007, ++ 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, ++ 0x6e0a, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, ++ 0x6e0a, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, ++ 0x1120, 0x7007, 0x0001, 0x0804, 0x6e25, 0x7007, 0x0003, 0x7012, ++ 0x2900, 0x7016, 0x701a, 0x704b, 0x6e25, 0x0005, 0xa864, 0x8007, ++ 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x6ca4, 0x7007, 0x0001, ++ 0x2009, 0x1833, 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff, ++ 0xa86a, 0xa883, 0x0000, 0x080c, 0x58e6, 0x1108, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x61a9, ++ 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064, ++ 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186, ++ 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8, ++ 0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, ++ 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, ++ 0x1120, 0x7007, 0x0001, 0x0804, 0x701a, 0x2900, 0x7016, 0x701a, ++ 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, 0x2098, ++ 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, 0x20a0, ++ 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x6cac, 0xaab4, ++ 0x928a, 0x0002, 0x1a04, 0x6cac, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, ++ 0x9105, 0x0118, 0x2001, 0x6dc8, 0x0018, 0x9280, 0x6dbe, 0x2005, ++ 0x7056, 0x7010, 0x9015, 0x0904, 0x6da9, 0x080c, 0x0fc7, 0x1118, ++ 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, ++ 0xa866, 0xe004, 0x7050, 0x2040, 0xa95c, 0x9100, 0xa076, 0xa860, ++ 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, ++ 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b, ++ 0xa17e, 0x080c, 0x108c, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, ++ 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, ++ 0x0fe0, 0x7014, 0x2048, 0x0804, 0x6cac, 0x7020, 0x2048, 0x7018, ++ 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, ++ 0x6d61, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, ++ 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x001e, 0x0904, 0x701a, 0x0804, 0x6e0a, 0x6dc0, 0x6dc4, ++ 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, ++ 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, 0xaebc, ++ 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, 0xb0d2, ++ 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, 0xb0ac, 0xb0c6, ++ 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, 0xb0a0, 0xb0b2, ++ 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, 0xb6aa, 0xb7a6, ++ 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, 0xb086, ++ 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, 0xb072, ++ 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, 0x1958, 0x006e, ++ 0x007e, 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x1178, 0x080c, ++ 0x5755, 0x1108, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0xb374, 0x080c, 0x61a9, 0x012e, 0x0ca0, 0x080c, 0xb752, ++ 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1833, 0x210c, ++ 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, ++ 0xd0f4, 0x0120, 0x080c, 0x5849, 0x1138, 0x0005, 0x9006, 0xa87a, ++ 0x080c, 0x57e4, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, ++ 0xa982, 0x080c, 0x61a9, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, ++ 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, ++ 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, ++ 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, ++ 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, ++ 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, ++ 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, ++ 0x080c, 0x5c0d, 0x11b8, 0x0066, 0xae80, 0x080c, 0x5d1d, 0x006e, ++ 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, ++ 0x00c6, 0x080c, 0x5c0d, 0x1110, 0x080c, 0x5e1d, 0x8108, 0x1f04, ++ 0x6e89, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x0fe0, 0x00be, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x00be, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x5f29, ++ 0x0580, 0x2061, 0x1a3d, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, ++ 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, ++ 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, ++ 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, ++ 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, ++ 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, ++ 0x70e3, 0x012e, 0x0804, 0x70dd, 0x012e, 0x0804, 0x70d7, 0x012e, ++ 0x0804, 0x70da, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, ++ 0x5f29, 0x05e0, 0x2061, 0x1a3d, 0x6000, 0xd084, 0x05b8, 0x6204, ++ 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, ++ 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, ++ 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, ++ 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, ++ 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, ++ 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, ++ 0x012e, 0x0804, 0x70e3, 0x012e, 0x0804, 0x70e0, 0x012e, 0x0804, ++ 0x70dd, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a3d, ++ 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, ++ 0x0804, 0x70f1, 0x012e, 0x0804, 0x70e0, 0x00b6, 0x0126, 0x00c6, ++ 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, ++ 0x2061, 0x1a3d, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, ++ 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1833, ++ 0x2004, 0x9005, 0x0118, 0x080c, 0x9584, 0x0068, 0x6017, 0xf400, ++ 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009, ++ 0x0041, 0x080c, 0x95ce, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, ++ 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x7a0a, 0x002e, ++ 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3d, 0x6000, 0xd08c, 0x1120, ++ 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, ++ 0x70e3, 0x00ce, 0x012e, 0x00be, 0x0804, 0x70dd, 0xa984, 0x9186, ++ 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, ++ 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, ++ 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, ++ 0x080c, 0x5c0d, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, ++ 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1953, 0x2004, 0x601a, ++ 0x0804, 0x6f78, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, ++ 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, 0x080c, 0x9584, 0x8eff, ++ 0x0118, 0x2e60, 0x080c, 0x9584, 0x00ee, 0x0804, 0x6f78, 0x6024, ++ 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, ++ 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, ++ 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x0804, 0x6f78, ++ 0x2061, 0x1a3d, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x70f1, ++ 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, ++ 0x0804, 0x70f1, 0x012e, 0xa883, 0x0016, 0x0804, 0x70ea, 0xa883, ++ 0x0007, 0x0804, 0x70ea, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, ++ 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x6ca4, ++ 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, ++ 0x701a, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, ++ 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, 0x709c, 0x6130, 0xd194, ++ 0x1904, 0x70c6, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x7090, ++ 0x6060, 0x9e02, 0x1a04, 0x7090, 0x7120, 0x9186, 0x0006, 0x1904, ++ 0x7082, 0x7010, 0x905d, 0x0904, 0x709c, 0xb800, 0xd0e4, 0x1904, ++ 0x70c0, 0x2061, 0x1a3d, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, ++ 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x70c9, 0xa883, 0x0000, 0xa803, ++ 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, ++ 0x1904, 0x70cc, 0x080c, 0x4dea, 0xd09c, 0x1118, 0xa87c, 0xc0cc, ++ 0xa87e, 0x2e60, 0x080c, 0x792a, 0x012e, 0x00ee, 0x00be, 0x0005, ++ 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, ++ 0x1904, 0x70cc, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, ++ 0xa883, 0x0006, 0x00be, 0x0804, 0x70ea, 0xd184, 0x0db8, 0xd1c4, ++ 0x1190, 0x00a0, 0xa974, 0x080c, 0x5c0d, 0x15d0, 0xb800, 0xd0e4, ++ 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, ++ 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, ++ 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x4dee, 0xd0fc, 0x01e8, ++ 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, 0x6060, 0x9e02, 0x12a8, ++ 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, ++ 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, ++ 0x7026, 0x7003, 0x0002, 0x0804, 0x7026, 0xa883, 0x0028, 0x0010, ++ 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, ++ 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, ++ 0x0014, 0x080c, 0xc58e, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, ++ 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, ++ 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, ++ 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, ++ 0x0005, 0x080c, 0x0fe0, 0x0005, 0x00d6, 0x080c, 0x7921, 0x00de, ++ 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, ++ 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7185, 0xd09c, ++ 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, 0x0040, 0x0278, 0x8001, ++ 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, ++ 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, ++ 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7185, 0x000e, ++ 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, ++ 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x7176, 0xa97c, 0x9188, ++ 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, ++ 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, ++ 0x94fe, 0x1118, 0x080c, 0x95a1, 0x05a8, 0x6212, 0xa874, 0x0002, ++ 0x7154, 0x7159, 0x715c, 0x7162, 0x2019, 0x0002, 0x080c, 0xc941, ++ 0x0060, 0x080c, 0xc8dd, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, ++ 0xc8f8, 0x0018, 0xa980, 0x080c, 0xc8dd, 0x080c, 0x9554, 0xa887, ++ 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x00be, ++ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, ++ 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, ++ 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, ++ 0x7187, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0d8d, ++ 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, ++ 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, ++ 0x1426, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, ++ 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x05e8, 0x7d44, 0x7c40, ++ 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, 0x2000, ++ 0x1258, 0x9584, 0x0700, 0x8007, 0x04a8, 0x7000, 0x9084, 0xff00, ++ 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, ++ 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xcce2, 0x080c, ++ 0x7692, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, ++ 0x76f0, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x724d, ++ 0x080c, 0x1f79, 0x005e, 0x004e, 0x0020, 0x080c, 0xcce2, 0x7817, ++ 0x0140, 0x080c, 0x722e, 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, ++ 0x8125, 0x0005, 0x0002, 0x7204, 0x74c3, 0x71fb, 0x71fb, 0x71fb, ++ 0x71fb, 0x71fb, 0x71fb, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, ++ 0x9005, 0x090c, 0x8125, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, ++ 0xf000, 0x810f, 0x9484, 0x0fff, 0x688a, 0x9286, 0x2000, 0x1150, ++ 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x4e04, 0x0070, 0x080c, ++ 0x726d, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x73fe, 0x0028, ++ 0x9286, 0x8000, 0x1110, 0x080c, 0x75c8, 0x7817, 0x0140, 0x2001, ++ 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, 0x0005, 0x2001, 0x180f, ++ 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, ++ 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x447f, ++ 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, ++ 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, ++ 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, ++ 0x180f, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086, ++ 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x447f, 0x002e, ++ 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, ++ 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, ++ 0x1904, 0x73cf, 0x9186, 0x0023, 0x1550, 0x080c, 0x7657, 0x0904, ++ 0x73cf, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, ++ 0x0015, 0x080c, 0x95ce, 0x0804, 0x73cf, 0x908e, 0x0214, 0x0118, ++ 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x95ce, 0x0804, ++ 0x73cf, 0x908e, 0x0100, 0x1904, 0x73cf, 0x7034, 0x9005, 0x1904, ++ 0x73cf, 0x2009, 0x0016, 0x080c, 0x95ce, 0x0804, 0x73cf, 0x9186, ++ 0x0022, 0x1904, 0x73cf, 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, 0x2446, 0x7932, 0x7936, ++ 0x001e, 0x000e, 0x00fe, 0x080c, 0x23fd, 0x6956, 0x703c, 0x00e6, ++ 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70ae, 0x00ee, 0x7034, ++ 0x9005, 0x1904, 0x73cf, 0x2009, 0x0017, 0x0804, 0x739c, 0x908e, ++ 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x73cf, 0x080c, 0x6877, ++ 0x0120, 0x2009, 0x001d, 0x0804, 0x739c, 0x68d8, 0xc0a5, 0x68da, ++ 0x2009, 0x0030, 0x0804, 0x739c, 0x908e, 0x0500, 0x1140, 0x7034, ++ 0x9005, 0x1904, 0x73cf, 0x2009, 0x0018, 0x0804, 0x739c, 0x908e, ++ 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x739c, 0x908e, 0x2110, ++ 0x1120, 0x2009, 0x001a, 0x0804, 0x739c, 0x908e, 0x5200, 0x1140, ++ 0x7034, 0x9005, 0x1904, 0x73cf, 0x2009, 0x001b, 0x0804, 0x739c, ++ 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x73cf, 0x2009, ++ 0x001c, 0x0804, 0x739c, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, ++ 0x0804, 0x739c, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, ++ 0x73cf, 0x2009, 0x0024, 0x0804, 0x739c, 0x908c, 0xff00, 0x918e, ++ 0x2400, 0x1120, 0x2009, 0x002d, 0x0804, 0x739c, 0x908c, 0xff00, ++ 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x739c, 0x908e, ++ 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x739c, 0x908e, 0x5300, ++ 0x1108, 0x00d8, 0x908e, 0x6104, 0x11c0, 0x2011, 0x026d, 0x8208, ++ 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, ++ 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x447f, 0x004e, 0x8108, ++ 0x1f04, 0x735e, 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, 0x23fd, 0x1568, 0x080c, 0x5bb0, 0x1550, ++ 0xbe12, 0xbd16, 0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186, ++ 0x0046, 0x1150, 0x6874, 0x9606, 0x1138, 0x6878, 0x9506, 0x9084, ++ 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0x94fe, 0x01a8, 0x2b08, ++ 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, ++ 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0x95ce, 0x00ce, ++ 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180d, 0x2004, 0xd0ec, ++ 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x080c, 0x95a1, 0x0d90, ++ 0x2b08, 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, 0x7c1d, 0x08a0, 0x080c, 0x2e39, ++ 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, ++ 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, ++ 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x7657, 0x0904, 0x745b, ++ 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, ++ 0x15d0, 0x2009, 0x0015, 0x080c, 0x95ce, 0x04a8, 0x908e, 0x0100, ++ 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x95ce, ++ 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, ++ 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, ++ 0x080c, 0x23fd, 0x11b8, 0x080c, 0x5bb0, 0x11a0, 0xbe12, 0xbd16, ++ 0x080c, 0x94fe, 0x0178, 0x2b08, 0x6112, 0x080c, 0xb4e6, 0x6023, ++ 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x95ce, 0x080c, 0x8125, ++ 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, ++ 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, ++ 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, ++ 0x0804, 0x74bd, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, ++ 0x74bd, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, ++ 0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, ++ 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, ++ 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, ++ 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, ++ 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, ++ 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, ++ 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7492, 0x82ff, 0x1118, ++ 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, ++ 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, ++ 0x000f, 0x0002, 0x74da, 0x74da, 0x74da, 0x7669, 0x74da, 0x74e3, ++ 0x750e, 0x759d, 0x74da, 0x74da, 0x74da, 0x74da, 0x74da, 0x74da, ++ 0x74da, 0x74da, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, 0x9005, ++ 0x090c, 0x8125, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, ++ 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6860, ++ 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, ++ 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, ++ 0x2009, 0x0046, 0x080c, 0x95ce, 0x7817, 0x0140, 0x2001, 0x19bd, ++ 0x2004, 0x9005, 0x090c, 0x8125, 0x00be, 0x0005, 0x00b6, 0x00c6, ++ 0x9484, 0x0fff, 0x0904, 0x7573, 0x7110, 0xd1bc, 0x1904, 0x7573, ++ 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, ++ 0x15b8, 0x81ff, 0x15a8, 0x9080, 0x2e6e, 0x200d, 0x918c, 0xff00, ++ 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7573, 0x080c, 0x5bb0, ++ 0x1904, 0x7573, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15e0, 0xba04, ++ 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x94fe, 0x05f0, ++ 0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, ++ 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xbfdb, ++ 0x0410, 0x080c, 0x5f2d, 0x2010, 0x1138, 0xb807, 0x0606, 0x0c28, ++ 0x190c, 0x745f, 0x11c0, 0x0890, 0x080c, 0x94fe, 0x2b08, 0x0198, ++ 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0004, 0x1118, ++ 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, ++ 0x9005, 0x090c, 0x8125, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180d, ++ 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x080c, ++ 0x95a1, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, ++ 0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x08b0, 0x00b6, 0x7110, 0xd1bc, ++ 0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, ++ 0x02a8, 0x6860, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, ++ 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, ++ 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x95ce, 0x7817, 0x0140, ++ 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, 0x00be, 0x0005, ++ 0x080c, 0x2e39, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, ++ 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, ++ 0x0005, 0x75df, 0x75e0, 0x75df, 0x75df, 0x763f, 0x764b, 0x0005, ++ 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x763d, ++ 0x700c, 0x7108, 0x080c, 0x23fd, 0x1904, 0x763d, 0x080c, 0x5bb0, ++ 0x1904, 0x763d, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, ++ 0x5f2d, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7657, ++ 0x00ce, 0x05d8, 0x080c, 0x94fe, 0x2b08, 0x05b8, 0x6112, 0x080c, ++ 0xb4e6, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, ++ 0x95ce, 0x0458, 0x080c, 0x5f2d, 0x0148, 0x9086, 0x0004, 0x0130, ++ 0x080c, 0x5f35, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x94fe, ++ 0x2b08, 0x01d8, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0005, 0x7120, ++ 0x610a, 0x2009, 0x0088, 0x080c, 0x95ce, 0x0078, 0x080c, 0x94fe, ++ 0x2b08, 0x0158, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0004, 0x7120, ++ 0x610a, 0x2009, 0x0001, 0x080c, 0x95ce, 0x00be, 0x0005, 0x7110, ++ 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, ++ 0x080c, 0x95ce, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, ++ 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x95ce, 0x0005, 0x7020, ++ 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, ++ 0x1818, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, ++ 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, ++ 0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6860, 0x9c02, 0x1280, ++ 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, ++ 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x95ce, ++ 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, ++ 0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, ++ 0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, ++ 0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, ++ 0x9086, 0xc000, 0x05d0, 0x080c, 0x94fe, 0x05b8, 0x0066, 0x00c6, ++ 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23fd, ++ 0x15a0, 0x080c, 0x5bb0, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, ++ 0x00ce, 0x6012, 0x080c, 0xb4e6, 0x080c, 0x0fae, 0x0510, 0x2900, ++ 0x605a, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, ++ 0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, ++ 0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, ++ 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00fe, 0x009e, 0x00ce, ++ 0x0005, 0x080c, 0x9554, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, ++ 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, ++ 0x2000, 0x1904, 0x7747, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, ++ 0x2004, 0x9005, 0x1904, 0x7749, 0x7030, 0x908e, 0x0400, 0x0904, ++ 0x7749, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, ++ 0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, ++ 0x1580, 0x080c, 0x5eeb, 0x0558, 0x68a8, 0x9084, 0x00ff, 0x7100, ++ 0x918c, 0x00ff, 0x9106, 0x1518, 0x6878, 0x69a8, 0x918c, 0xff00, ++ 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, ++ 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, ++ 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, ++ 0x7657, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, ++ 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x2071, 0x19c7, 0x7003, ++ 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7076, 0x7012, 0x7017, ++ 0x1cd0, 0x7007, 0x0000, 0x7026, 0x702b, 0x8b66, 0x7032, 0x7037, ++ 0x8bc9, 0x703f, 0xffff, 0x7043, 0xffff, 0x7046, 0x704b, 0x4c8b, ++ 0x704e, 0x705f, 0x78ae, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0x2900, ++ 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, ++ 0x2071, 0x19c7, 0x1d04, 0x7809, 0x2091, 0x6000, 0x700c, 0x8001, ++ 0x700e, 0x1510, 0x2001, 0x1874, 0x2004, 0xd0c4, 0x0158, 0x3a00, ++ 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, ++ 0x080c, 0x0d84, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x78f3, 0x7044, 0x900d, 0x0148, 0x8109, 0x7146, ++ 0x1130, 0x7048, 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, 0x8c48, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, ++ 0x0118, 0x0310, 0x8001, 0x703e, 0x7040, 0x9005, 0x0118, 0x0310, ++ 0x8001, 0x7042, 0x7050, 0x900d, 0x0168, 0x704c, 0x8001, 0x704e, ++ 0x1148, 0x704f, 0x0009, 0x8109, 0x7152, 0x1120, 0x7154, 0x7152, ++ 0x705c, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7074, 0x900d, ++ 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, 0x782f, 0x7830, 0x784a, 0x00e6, 0x2071, ++ 0x19c7, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, ++ 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19c7, 0x701c, 0x9206, ++ 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, ++ 0x19c7, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, ++ 0x00b6, 0x7110, 0x080c, 0x5c0d, 0x1158, 0xb888, 0x8001, 0x0240, ++ 0xb88a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, ++ 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, ++ 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, ++ 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xb38b, 0x6018, ++ 0x9005, 0x0510, 0x8001, 0x601a, 0x11f8, 0x6120, 0x9186, 0x0003, ++ 0x0118, 0x9186, 0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a, ++ 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, ++ 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, ++ 0xd0e4, 0x0110, 0x080c, 0xaddd, 0x012e, 0x9c88, 0x0018, 0x7116, ++ 0x2001, 0x1818, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, ++ 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c7, 0x7027, 0x07d0, 0x7023, ++ 0x0009, 0x00ee, 0x0005, 0x2001, 0x19d0, 0x2003, 0x0000, 0x0005, ++ 0x00e6, 0x2071, 0x19c7, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, ++ 0x2011, 0x19d3, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c7, ++ 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, ++ 0x7058, 0x8000, 0x705a, 0x2001, 0x19d5, 0x2044, 0xa06c, 0x9086, ++ 0x0000, 0x0150, 0x706c, 0xa09a, 0x7068, 0xa096, 0x7064, 0xa092, ++ 0x7060, 0xa08e, 0x080c, 0x108c, 0x002e, 0x008e, 0x0005, 0x0006, ++ 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, ++ 0x0156, 0x080c, 0x7778, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, ++ 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, ++ 0x19c7, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, 0x00e6, ++ 0x0006, 0x2071, 0x19c7, 0x7078, 0x9206, 0x1110, 0x7076, 0x707a, ++ 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1518, ++ 0x0026, 0xd1ec, 0x0140, 0x684c, 0x9082, 0x0200, 0x0288, 0x8117, ++ 0x9294, 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, ++ 0x0007, 0x0110, 0x69ee, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, ++ 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68ee, ++ 0x080c, 0x0e8d, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3d, 0x00ce, ++ 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a3d, ++ 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, ++ 0x00c6, 0x2061, 0x1a3d, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, ++ 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, ++ 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, ++ 0x79b4, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x798d, 0x2009, 0x0006, ++ 0x080c, 0x79e1, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, ++ 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, ++ 0x79db, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, ++ 0x11e8, 0x2009, 0x1874, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, ++ 0x2009, 0x0043, 0x0804, 0x95ce, 0x0005, 0x87ff, 0x1de8, 0x2009, ++ 0x0042, 0x0804, 0x95ce, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, ++ 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, ++ 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, ++ 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x79db, 0x908c, 0x2020, ++ 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x150d, ++ 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x95ce, ++ 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, ++ 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, ++ 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148, ++ 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x95ce, 0x0005, 0x00b9, ++ 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x95ce, 0x0cb0, ++ 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, ++ 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, ++ 0x0001, 0x0096, 0x080c, 0xb0ad, 0x0518, 0x6014, 0x2048, 0xa982, ++ 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, ++ 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3d, 0x6200, 0xd28c, ++ 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x5ff7, ++ 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x792a, 0x007e, ++ 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3d, 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, 0x7a2c, 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, 0x7a56, 0x0028, 0x911a, ++ 0x2308, 0x8210, 0x1f04, 0x7a56, 0x0006, 0x3200, 0x9084, 0xefff, ++ 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, ++ 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19b4, ++ 0x012e, 0x00d6, 0x2069, 0x19b4, 0x6803, 0x0005, 0x0156, 0x0146, ++ 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0x9363, 0x0401, ++ 0x080c, 0x934e, 0x00e9, 0x080c, 0x9351, 0x00d1, 0x080c, 0x9354, ++ 0x00b9, 0x080c, 0x9357, 0x00a1, 0x080c, 0x935a, 0x0089, 0x080c, ++ 0x935d, 0x0071, 0x080c, 0x9360, 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, 0x7ac8, 0x7aec, ++ 0x7b36, 0x7ace, 0x7aec, 0x7ac8, 0x7ac6, 0x7ac6, 0x080c, 0x0d84, ++ 0x080c, 0x7893, 0x080c, 0x8125, 0x00ce, 0x0005, 0x62c0, 0x82ff, ++ 0x1110, 0x00ce, 0x0005, 0x2011, 0x554d, 0x080c, 0x781a, 0x7828, ++ 0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x558a, 0x0c88, ++ 0x62c0, 0x080c, 0x9367, 0x080c, 0x554d, 0x7807, 0x0003, 0x7827, ++ 0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, 0x7893, 0x6220, 0xd2a4, ++ 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, ++ 0x090c, 0x0d84, 0x2009, 0x0013, 0x080c, 0x95ce, 0x00ce, 0x0005, ++ 0x00c6, 0x7824, 0x9065, 0x090c, 0x0d84, 0x7804, 0x9086, 0x0004, ++ 0x0904, 0x7b74, 0x7828, 0x9092, 0xc350, 0x1230, 0x8000, 0x782a, ++ 0x00ce, 0x080c, 0x8b2c, 0x0c50, 0x2011, 0x0130, 0x2214, 0x080c, ++ 0x9367, 0x6104, 0x9186, 0x0003, 0x1188, 0x00e6, 0x2071, 0x1800, ++ 0x70e4, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, ++ 0x2071, 0x1800, 0x080c, 0x55a0, 0x00ee, 0x00ce, 0x080c, 0xcd1f, ++ 0x2009, 0x0014, 0x080c, 0x95ce, 0x00ce, 0x0840, 0x2001, 0x19d0, ++ 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, ++ 0x9065, 0x090c, 0x0d84, 0x2009, 0x0013, 0x080c, 0x9620, 0x00ce, ++ 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, 0x090c, 0x0d84, ++ 0x781c, 0x905d, 0x090c, 0x0d84, 0x080c, 0x9367, 0xb800, 0xc0dc, ++ 0xb802, 0x7924, 0x2160, 0x080c, 0x9554, 0xb93c, 0x81ff, 0x090c, ++ 0x0d84, 0x8109, 0xb93e, 0xb854, 0x9015, 0x0110, 0x7a1e, 0x0010, ++ 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, ++ 0x00be, 0x080c, 0x8125, 0x0898, 0x6104, 0x9186, 0x0002, 0x0128, ++ 0x9186, 0x0004, 0x0110, 0x0804, 0x7b0a, 0x7808, 0x9c06, 0x0904, ++ 0x7b0a, 0x080c, 0x8026, 0x080c, 0x7c1d, 0x00ce, 0x080c, 0x8125, ++ 0x0804, 0x7afe, 0x00c6, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, ++ 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, ++ 0x0049, 0x080c, 0x95ce, 0x00ce, 0x0005, 0x2011, 0x19d3, 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, 0x95ce, 0x08a0, 0x7848, ++ 0xc085, 0x784a, 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, 0x6020, 0x8000, ++ 0x6022, 0x6010, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, ++ 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, ++ 0x00d6, 0x2069, 0x19b4, 0xb800, 0xd0d4, 0x01b8, 0x6820, 0x8000, ++ 0x6822, 0x9086, 0x0001, 0x1110, 0x2b00, 0x681e, 0x2001, 0x180c, ++ 0x2004, 0xd0fc, 0x0118, 0x00de, 0x0804, 0x8125, 0x6804, 0x9084, ++ 0x0007, 0x0804, 0x813c, 0x00de, 0x0005, 0xc0d5, 0xb802, 0x6818, ++ 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, 0x0006, 0x2b00, ++ 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19b4, 0x08b8, 0xb856, ++ 0xb85a, 0x2b00, 0x681a, 0x681e, 0x0888, 0x0006, 0x0016, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, ++ 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080, 0x0003, ++ 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, ++ 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, ++ 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136, 0x00ce, ++ 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, ++ 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, ++ 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19b4, 0x7638, 0x2660, ++ 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x7cc4, 0x6010, 0x2058, ++ 0xb8a0, 0x9206, 0x1904, 0x7cbf, 0x87ff, 0x0120, 0x6054, 0x9106, ++ 0x1904, 0x7cbf, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, ++ 0x080c, 0x8dfe, 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, 0xb0ad, ++ 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, 0xa867, ++ 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, ++ 0xb374, 0x080c, 0xcc6b, 0x080c, 0x61a9, 0x007e, 0x003e, 0x001e, ++ 0x080c, 0xb278, 0x080c, 0x9584, 0x00ce, 0x0804, 0x7c63, 0x2c78, ++ 0x600c, 0x2060, 0x0804, 0x7c63, 0x85ff, 0x0120, 0x0036, 0x080c, ++ 0x820b, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, ++ 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, ++ 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, ++ 0x080c, 0xcc6b, 0x080c, 0xc970, 0x007e, 0x003e, 0x001e, 0x0890, ++ 0x6020, 0x9086, 0x000a, 0x0904, 0x7ca9, 0x0804, 0x7ca7, 0x0006, ++ 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, ++ 0x8000, 0x2079, 0x19b4, 0x7838, 0x9065, 0x0904, 0x7d3f, 0x600c, ++ 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, ++ 0x0001, 0x080c, 0x8dfe, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, ++ 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xb0ad, 0x0520, 0x6014, 0x2048, ++ 0x6020, 0x9086, 0x0003, 0x1568, 0x3e08, 0x918e, 0x0002, 0x1188, ++ 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, ++ 0x0140, 0x6040, 0x9005, 0x1180, 0x2001, 0x1955, 0x2004, 0x6042, ++ 0x0058, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, ++ 0x080c, 0xb278, 0x080c, 0x9584, 0x000e, 0x0804, 0x7cfc, 0x7e3a, ++ 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, ++ 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xc970, 0x0c50, ++ 0x6020, 0x9086, 0x000a, 0x09f8, 0x08e0, 0x0016, 0x0026, 0x0086, ++ 0x9046, 0x0099, 0x080c, 0x7e2b, 0x008e, 0x002e, 0x001e, 0x0005, ++ 0x00f6, 0x0126, 0x2079, 0x19b4, 0x2091, 0x8000, 0x080c, 0x7ec2, ++ 0x080c, 0x7f3a, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, ++ 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0x19b4, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, ++ 0x7dfc, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x7df7, 0x88ff, ++ 0x0120, 0x6054, 0x9106, 0x1904, 0x7df7, 0x7024, 0x9c06, 0x1550, ++ 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c, 0x7893, 0x080c, ++ 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, ++ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 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, 0x2048, 0x080c, 0xb0ad, ++ 0x01b8, 0x6020, 0x9086, 0x0003, 0x1550, 0xa867, 0x0103, 0xab7a, ++ 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xb374, 0x080c, ++ 0xcc6b, 0x080c, 0x61a9, 0x008e, 0x003e, 0x001e, 0x080c, 0xb278, ++ 0x080c, 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x7d7e, 0x2c78, ++ 0x600c, 0x2060, 0x0804, 0x7d7e, 0x012e, 0x000e, 0x001e, 0x006e, ++ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, ++ 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xcc6b, ++ 0x080c, 0xc970, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0x9e99, ++ 0x6020, 0x9086, 0x0002, 0x1130, 0x6004, 0x9086, 0x0085, 0x0904, ++ 0x7ddd, 0x0870, 0x6020, 0x9086, 0x0005, 0x1950, 0x6004, 0x9086, ++ 0x0085, 0x0d08, 0x0828, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, ++ 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, ++ 0x7ebb, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19b4, 0xbe54, ++ 0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff, ++ 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108, ++ 0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000, ++ 0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5b43, ++ 0x0904, 0x7eb7, 0x7624, 0x86ff, 0x0904, 0x7ea6, 0x9680, 0x0005, ++ 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, ++ 0x0560, 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, ++ 0x900f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, ++ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, ++ 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, ++ 0x2660, 0x080c, 0x9584, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, ++ 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7e5e, 0x89ff, 0x0158, ++ 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb374, 0x080c, ++ 0xcc6b, 0x080c, 0x61a9, 0x080c, 0x8eec, 0x0804, 0x7e5e, 0x006e, ++ 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, ++ 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, ++ 0x7814, 0x9065, 0x0904, 0x7f17, 0x600c, 0x0006, 0x600f, 0x0000, ++ 0x7824, 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, ++ 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, ++ 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, ++ 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, ++ 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, ++ 0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6014, 0x2048, ++ 0x080c, 0xb0ab, 0x0168, 0x6020, 0x9086, 0x0003, 0x11c0, 0xa867, ++ 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, ++ 0x080c, 0x9584, 0x080c, 0x8eec, 0x000e, 0x0804, 0x7ec9, 0x7e16, ++ 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, ++ 0x9086, 0x0006, 0x1118, 0x080c, 0xc970, 0x0c50, 0x080c, 0x9e99, ++ 0x6020, 0x9086, 0x0002, 0x1128, 0x6004, 0x9086, 0x0085, 0x09b8, ++ 0x08f8, 0x6020, 0x9086, 0x0005, 0x19d8, 0x6004, 0x9086, 0x0085, ++ 0x0d50, 0x08b0, 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, ++ 0x7818, 0x905d, 0x0904, 0x7fb7, 0xb854, 0x0006, 0x9006, 0xb856, ++ 0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5b43, 0x0904, ++ 0x7fb4, 0x7e24, 0x86ff, 0x0904, 0x7fa7, 0x9680, 0x0005, 0x2004, ++ 0x9906, 0x1904, 0x7fa7, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, ++ 0x05e8, 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, ++ 0x900f, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, ++ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, ++ 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, ++ 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1508, 0x2009, ++ 0x1955, 0x210c, 0x2102, 0x00e0, 0xb83c, 0x9005, 0x0110, 0x8001, ++ 0xb83e, 0x2660, 0x080c, 0x9584, 0x00ce, 0x0048, 0x00de, 0x00c6, ++ 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7f4d, 0x89ff, ++ 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, ++ 0x080c, 0x8eec, 0x0804, 0x7f4d, 0x000e, 0x0804, 0x7f41, 0x781e, ++ 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, ++ 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, ++ 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19b4, 0x7024, ++ 0x9035, 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, 0xb800, ++ 0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, ++ 0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660, ++ 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x8b50, 0x78c3, ++ 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, ++ 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, ++ 0x7827, 0x0001, 0x080c, 0x900f, 0x003e, 0x080c, 0x5b43, 0x00c6, ++ 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0x9554, ++ 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb374, ++ 0x080c, 0x61a9, 0x080c, 0x8eec, 0x00fe, 0x0005, 0x00b6, 0x00e6, ++ 0x00c6, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b4, ++ 0x7004, 0x9084, 0x0007, 0x0002, 0x803e, 0x8042, 0x8059, 0x8082, ++ 0x80c0, 0x803e, 0x8059, 0x803c, 0x080c, 0x0d84, 0x00ce, 0x00ee, ++ 0x00be, 0x0005, 0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022, ++ 0x600c, 0x9015, 0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, ++ 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212, ++ 0x0ca8, 0x6010, 0x2058, 0x080c, 0x5b43, 0xb800, 0xc0dc, 0xb802, ++ 0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148, ++ 0x2001, 0x180c, 0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be, ++ 0x0005, 0xb854, 0x9015, 0x0120, 0x721e, 0x080c, 0x8125, 0x0ca8, ++ 0x7218, 0x721e, 0x080c, 0x8125, 0x0c80, 0xc2ec, 0x2202, 0x080c, ++ 0x820b, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, ++ 0x080c, 0x8eec, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, ++ 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, ++ 0x8eec, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, ++ 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, ++ 0x2058, 0x080c, 0x5b43, 0xb800, 0xc0dc, 0xb802, 0x080c, 0x8eec, ++ 0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, ++ 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, ++ 0x7024, 0x9065, 0x0140, 0x080c, 0x8eec, 0x600c, 0x9015, 0x0158, ++ 0x720e, 0x600f, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x00ce, ++ 0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, ++ 0x19b4, 0x6830, 0x9084, 0x0003, 0x0002, 0x80e3, 0x80e5, 0x8109, ++ 0x80e1, 0x080c, 0x0d84, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, ++ 0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, ++ 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, ++ 0x19d3, 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, 0x180c, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, ++ 0xd1ec, 0x0138, 0xc1ec, 0x2102, 0x080c, 0x820b, 0x2001, 0x180c, ++ 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0d50, 0x00d6, 0x2069, ++ 0x19b4, 0x6804, 0x9084, 0x0007, 0x0002, 0x8147, 0x81ea, 0x81ea, ++ 0x81ea, 0x81ea, 0x81ec, 0x81ea, 0x8145, 0x080c, 0x0d84, 0x6820, ++ 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, ++ 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, ++ 0x00de, 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, ++ 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, 0x00de, 0x0005, 0x00b6, ++ 0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x81d6, 0xb84c, 0x900d, ++ 0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, ++ 0x0904, 0x81d6, 0x0028, 0x6818, 0x920e, 0x0904, 0x81d6, 0x2058, ++ 0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, ++ 0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, 0x952b, 0x0904, 0x81d6, ++ 0x8318, 0xbb3e, 0x6116, 0x2b10, 0x6212, 0x0096, 0x2148, 0xa880, ++ 0x9084, 0x00ff, 0x605e, 0xa883, 0x0000, 0xa884, 0x009e, 0x908a, ++ 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0x9318, ++ 0x631a, 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c, 0x00ff, ++ 0x918e, 0x0048, 0x0538, 0x00f6, 0x2c78, 0x2061, 0x0100, 0xbab0, ++ 0x629a, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x8786, 0x2069, ++ 0x19b4, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0002, 0x2f18, 0x6b26, ++ 0x682b, 0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, ++ 0x00fe, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00be, ++ 0x00ce, 0x0cd0, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0006, 0x2f18, ++ 0x6b26, 0x682b, 0x0000, 0x080c, 0x9387, 0x00ee, 0x00be, 0x00ce, ++ 0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138, ++ 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, ++ 0x00de, 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, ++ 0x00fe, 0x0005, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0120, 0xc2e4, ++ 0x2202, 0x080c, 0x8136, 0x00f6, 0x00d6, 0x2069, 0x19b4, 0x6830, ++ 0x9086, 0x0000, 0x11f0, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x11e0, ++ 0x6838, 0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x1588, 0x6833, ++ 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, ++ 0x2091, 0x2400, 0x002e, 0x080c, 0x1933, 0x1178, 0x012e, 0x080c, ++ 0x899e, 0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, ++ 0x0001, 0x080c, 0x691e, 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000, ++ 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, ++ 0x6833, 0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, ++ 0x6a04, 0x9296, 0x0006, 0x0958, 0x0804, 0x81fa, 0x6020, 0x9084, ++ 0x000f, 0x000b, 0x0005, 0x826a, 0x826f, 0x86ca, 0x874f, 0x826f, ++ 0x86ca, 0x874f, 0x826a, 0x826f, 0x826a, 0x826a, 0x826a, 0x826a, ++ 0x826a, 0x826a, 0x080c, 0x8026, 0x080c, 0x8125, 0x0005, 0x00b6, ++ 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, ++ 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, ++ 0x1a0c, 0x0d84, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, ++ 0x619a, 0x908a, 0x0040, 0x1a04, 0x82db, 0x005b, 0x00fe, 0x00ee, ++ 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, ++ 0x0005, 0x8451, 0x848c, 0x84b5, 0x8559, 0x857b, 0x8581, 0x858e, ++ 0x8596, 0x85a2, 0x85a8, 0x85b9, 0x85a8, 0x8611, 0x8596, 0x861d, ++ 0x8623, 0x85a2, 0x8623, 0x862f, 0x82d9, 0x82d9, 0x82d9, 0x82d9, ++ 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x8c9a, ++ 0x8cb0, 0x8cba, 0x8cda, 0x8d0c, 0x858e, 0x82d9, 0x858e, 0x85a8, ++ 0x82d9, 0x84b5, 0x8559, 0x82d9, 0x90fc, 0x85a8, 0x82d9, 0x9118, ++ 0x85a8, 0x82d9, 0x85a2, 0x844b, 0x82fc, 0x82d9, 0x912e, 0x919a, ++ 0x9271, 0x82d9, 0x927e, 0x858b, 0x92a9, 0x82d9, 0x8d16, 0x92d6, ++ 0x82d9, 0x080c, 0x0d84, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, ++ 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, ++ 0x82fa, 0x82fa, 0x82fa, 0x8322, 0x83ce, 0x83d9, 0x82fa, 0x82fa, ++ 0x82fa, 0x8420, 0x842c, 0x833d, 0x82fa, 0x8358, 0x838c, 0x9447, ++ 0x948c, 0x85a8, 0x080c, 0x0d84, 0x00d6, 0x0096, 0x080c, 0x8642, ++ 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, ++ 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, ++ 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, ++ 0xb8a0, 0x00be, 0x080c, 0x94d3, 0x1110, 0xd0bc, 0x0110, 0x9085, ++ 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8642, 0x7003, 0x0500, ++ 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, ++ 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, ++ 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, ++ 0x8642, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, ++ 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, ++ 0x701e, 0x60c3, 0x0010, 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, ++ 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8642, 0x20e9, ++ 0x0000, 0x2001, 0x1970, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, ++ 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, ++ 0x001b, 0x2098, 0x2001, 0x1970, 0x0016, 0x200c, 0x2001, 0x0001, ++ 0x080c, 0x1ff9, 0x080c, 0xbd44, 0x9006, 0x080c, 0x1ff9, 0x001e, ++ 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x8b24, ++ 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x868d, 0x20e9, 0x0000, 0x2001, 0x1970, 0x2003, ++ 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, ++ 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, ++ 0x001b, 0x2098, 0x2001, 0x1970, 0x0016, 0x200c, 0x080c, 0xbd44, ++ 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, ++ 0x2048, 0x080c, 0x0f60, 0x080c, 0x8b24, 0x012e, 0x009e, 0x00de, ++ 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, ++ 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8642, ++ 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, ++ 0x8b24, 0x00d6, 0x00e6, 0x080c, 0x868d, 0x7814, 0x9084, 0xff00, ++ 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, ++ 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, ++ 0x8d68, 0x8e70, 0x1f04, 0x83ef, 0x2069, 0x1801, 0x20a9, 0x0004, ++ 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x83f8, 0x2069, 0x1980, 0x9086, ++ 0xdf00, 0x0110, 0x2069, 0x199a, 0x20a9, 0x001a, 0x9e86, 0x0260, ++ 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, ++ 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, ++ 0x8406, 0x60c3, 0x004c, 0x080c, 0x8b24, 0x00ee, 0x00de, 0x0005, ++ 0x080c, 0x8642, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, ++ 0x60c3, 0x0008, 0x0804, 0x8b24, 0x00d6, 0x0026, 0x0016, 0x080c, ++ 0x868d, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, ++ 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, ++ 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8b24, 0x001e, ++ 0x002e, 0x00de, 0x0005, 0x2001, 0x1816, 0x2004, 0x609a, 0x0804, ++ 0x8b24, 0x080c, 0x8642, 0x7003, 0x5200, 0x2069, 0x1852, 0x6804, ++ 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2430, 0x710e, 0x001e, ++ 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, ++ 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, ++ 0x0254, 0x4003, 0x080c, 0x94d3, 0x1120, 0xb8a0, 0x9082, 0x007f, ++ 0x0248, 0x2001, 0x181d, 0x2004, 0x7032, 0x2001, 0x181e, 0x2004, ++ 0x7036, 0x0030, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x7036, ++ 0x60c3, 0x001c, 0x0804, 0x8b24, 0x080c, 0x8642, 0x7003, 0x0500, ++ 0x080c, 0x94d3, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, ++ 0x181d, 0x2004, 0x700a, 0x2001, 0x181e, 0x2004, 0x700e, 0x0030, ++ 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, ++ 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, ++ 0x4003, 0x60c3, 0x0010, 0x0804, 0x8b24, 0x080c, 0x8642, 0x9006, ++ 0x080c, 0x5ef7, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, ++ 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, ++ 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, ++ 0x9086, 0x007e, 0x1904, 0x8520, 0x00d6, 0x2069, 0x193b, 0x2001, ++ 0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084, ++ 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, ++ 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, ++ 0x080c, 0x6877, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, ++ 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, ++ 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, ++ 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, ++ 0x934e, 0x2069, 0x1943, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, ++ 0x080c, 0x4dee, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, ++ 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, 0x193c, ++ 0x200c, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, ++ 0x2471, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193b, 0x20e9, ++ 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, ++ 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, ++ 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x934e, 0x20a1, 0x024e, ++ 0x20a9, 0x0008, 0x2099, 0x1943, 0x4003, 0x60c3, 0x0074, 0x0804, ++ 0x8b24, 0x080c, 0x8642, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, ++ 0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1852, 0x7904, ++ 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, ++ 0x0010, 0x9085, 0x0002, 0x00d6, 0x0804, 0x85f2, 0x7026, 0x60c3, ++ 0x0014, 0x0804, 0x8b24, 0x080c, 0x8642, 0x7003, 0x5000, 0x0804, ++ 0x84cf, 0x080c, 0x8642, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, ++ 0x0014, 0x0804, 0x8b24, 0x080c, 0x8684, 0x0010, 0x080c, 0x868d, ++ 0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0x8b24, 0x080c, 0x868d, ++ 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, ++ 0x0804, 0x8b24, 0x080c, 0x868d, 0x7003, 0x0200, 0x0804, 0x84cf, ++ 0x080c, 0x868d, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, ++ 0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, ++ 0x8b24, 0x00d6, 0x080c, 0x868d, 0x7003, 0x0210, 0x7007, 0x0014, ++ 0x700b, 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, ++ 0x0030, 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, ++ 0x700f, 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, ++ 0x0028, 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, ++ 0x1852, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, ++ 0x0110, 0x9085, 0x0010, 0x2009, 0x1874, 0x210c, 0xd184, 0x1110, ++ 0x9085, 0x0002, 0x0026, 0x2009, 0x1872, 0x210c, 0xd1e4, 0x0150, ++ 0xc0c5, 0xbabc, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, ++ 0x0010, 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, ++ 0x0108, 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, ++ 0x8b24, 0x080c, 0x868d, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, ++ 0x0100, 0x60c3, 0x0014, 0x0804, 0x8b24, 0x080c, 0x868d, 0x7003, ++ 0x0200, 0x0804, 0x8455, 0x080c, 0x868d, 0x7003, 0x0100, 0x700b, ++ 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x080c, ++ 0x868d, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, ++ 0x8b24, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, ++ 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, ++ 0x2021, 0x0100, 0x080c, 0x9363, 0xb810, 0x9305, 0x7002, 0xb814, ++ 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x9485, ++ 0x0029, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8b12, 0x721a, ++ 0x9f95, 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, ++ 0x0005, 0x0026, 0x080c, 0x9363, 0x7003, 0x02ff, 0x7007, 0xfffc, ++ 0x00d6, 0x2069, 0x1800, 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, 0x9363, 0xb810, ++ 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, ++ 0x1140, 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, ++ 0x0020, 0x6874, 0x700a, 0x6878, 0x700e, 0x0000, 0x9485, 0x0098, ++ 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8b12, 0x721a, 0x7a08, ++ 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, ++ 0x8b12, 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, ++ 0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, ++ 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d84, ++ 0x908a, 0x0092, 0x1a0c, 0x0d84, 0x6110, 0x2158, 0xb9b0, 0x2c78, ++ 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, ++ 0x00de, 0x00ce, 0x00be, 0x0005, 0x86fb, 0x8700, 0x870b, 0x86f9, ++ 0x86f9, 0x86f9, 0x86fb, 0x86f9, 0x86f9, 0x86f9, 0x86f9, 0x86f9, ++ 0x86f9, 0x080c, 0x0d84, 0x00c1, 0x60c3, 0x0000, 0x0804, 0x8b24, ++ 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, ++ 0x000c, 0x0804, 0x8b24, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, ++ 0x60c3, 0x0004, 0x0804, 0x8b24, 0x0026, 0x080c, 0x9363, 0xb810, ++ 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, ++ 0x700a, 0x6878, 0x700e, 0x7013, 0x0009, 0x0804, 0x865d, 0x0026, ++ 0x080c, 0x9363, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, ++ 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001, 0x0099, ++ 0x7012, 0x0804, 0x86bf, 0x0026, 0x080c, 0x9363, 0xb810, 0x9085, ++ 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, ++ 0x6878, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x86bf, 0x00b6, ++ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, ++ 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d84, 0x908a, 0x0054, ++ 0x1a0c, 0x0d84, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, 0x619a, ++ 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, ++ 0x0005, 0x8786, 0x882d, 0x8800, 0x894f, 0x8784, 0x8784, 0x8784, ++ 0x8784, 0x8784, 0x8784, 0x8784, 0x8eb9, 0x8ec5, 0x8ed1, 0x8edd, ++ 0x8784, 0x92b5, 0x8784, 0x8ead, 0x080c, 0x0d84, 0x0096, 0x780b, ++ 0xffff, 0x080c, 0x87dc, 0x7914, 0x2148, 0xa978, 0x7956, 0x7132, ++ 0xa97c, 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, 0x150d, 0x0050, 0xd1b4, 0x0118, 0x7047, ++ 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, 0xaab0, ++ 0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, 0xa860, ++ 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, 0x2069, ++ 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, 0x0020, ++ 0x6017, 0x0009, 0x2001, 0x19d0, 0x2003, 0x07d0, 0x2001, 0x19cf, ++ 0x2003, 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, ++ 0xb8bc, 0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e, 0x732a, ++ 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, ++ 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a74, 0x720a, 0x6a78, ++ 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, ++ 0x00d6, 0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002, 0xa88c, ++ 0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c, 0x009e, ++ 0x00de, 0x0804, 0x8b24, 0x6813, 0x0008, 0xb810, 0x9085, 0x0500, ++ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, ++ 0x700e, 0x7013, 0x0889, 0x080c, 0x8b12, 0x721a, 0x7a08, 0x7222, ++ 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c, ++ 0x892d, 0x7814, 0x2048, 0x080c, 0xb0ab, 0x1130, 0x7814, 0x9084, ++ 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, 0x00de, ++ 0x0005, 0x884b, 0x88b4, 0x88c4, 0x88ea, 0x88f6, 0x8907, 0x890f, ++ 0x8849, 0x080c, 0x0d84, 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003, ++ 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168, ++ 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, 0x2001, ++ 0x197e, 0x2004, 0x60c2, 0x0804, 0x8b24, 0xc3e5, 0x0c88, 0x9186, ++ 0x0001, 0x190c, 0x0d84, 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x88b1, ++ 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026, 0xa8ac, ++ 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4, 0x0110, ++ 0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810, 0x9085, ++ 0x0010, 0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0, 0x0156, ++ 0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c, 0x2098, ++ 0x4003, 0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0, 0x20a9, ++ 0x0005, 0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184, 0x0003, ++ 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e, 0x0804, ++ 0x8b24, 0xc3e5, 0x0804, 0x8870, 0x2011, 0x0008, 0x2001, 0x180e, ++ 0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1110, ++ 0x7216, 0x0470, 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, ++ 0x0804, 0x8b24, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216, ++ 0x60c3, 0x0018, 0x0804, 0x8b24, 0x0cd0, 0xc2e5, 0x2011, 0x0100, ++ 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, ++ 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x8b24, 0x2011, ++ 0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08, 0x0036, ++ 0x7b14, 0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138, ++ 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888, 0x0046, ++ 0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5, ++ 0x7416, 0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813, 0x0008, ++ 0xb810, 0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, ++ 0x6874, 0x700a, 0x6878, 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013, ++ 0x0898, 0x080c, 0x8b12, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, ++ 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016, ++ 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x895f, ++ 0x895f, 0x8961, 0x895f, 0x895f, 0x895f, 0x897b, 0x895f, 0x080c, ++ 0x0d84, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, ++ 0x0003, 0x00b9, 0x2069, 0x1852, 0x6804, 0xd0bc, 0x0130, 0x682c, ++ 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, ++ 0x0001, 0x0804, 0x8b24, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, ++ 0x0cb0, 0x0016, 0x080c, 0x9363, 0x001e, 0xb810, 0x9085, 0x0100, ++ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a74, 0x720a, 0x6a78, ++ 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8b12, ++ 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x0096, ++ 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, ++ 0x2071, 0x1800, 0x7158, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, ++ 0xba14, 0x7374, 0x7478, 0x7820, 0x90be, 0x0006, 0x0904, 0x8a81, ++ 0x90be, 0x000a, 0x1904, 0x8a3d, 0x609f, 0x0000, 0x7814, 0x2048, ++ 0xa87c, 0xd0fc, 0x05c8, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, ++ 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0x9005, ++ 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705, ++ 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, ++ 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001, ++ 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048, ++ 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039, ++ 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073, ++ 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00, ++ 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000, ++ 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, ++ 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, ++ 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, ++ 0x9348, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, ++ 0x2009, 0x1b58, 0x080c, 0x7898, 0x003e, 0x004e, 0x005e, 0x00ce, ++ 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, 0x0040, ++ 0x0904, 0x8abd, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, ++ 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7, 0x0000, ++ 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, ++ 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048, 0xa838, ++ 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, ++ 0x60ce, 0xbab0, 0x629e, 0x080c, 0x9348, 0x2009, 0x07d0, 0x60c4, ++ 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7898, ++ 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, ++ 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, ++ 0x0904, 0x8ad9, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, ++ 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, ++ 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086, 0x7808, ++ 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6, 0xa8ac, ++ 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c, 0x9109, ++ 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, ++ 0x629e, 0x080c, 0x9325, 0x0804, 0x8a6d, 0xb8bc, 0xd084, 0x0148, ++ 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, 0xa836, 0x2900, 0xa83a, ++ 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073, ++ 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000, 0x0804, ++ 0x8a50, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x7824, ++ 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073, 0x0898, ++ 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, ++ 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0xa838, ++ 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, ++ 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, 0x629e, 0x7824, ++ 0xd0cc, 0x0120, 0x080c, 0x9348, 0x0804, 0x8a6d, 0x080c, 0x9325, ++ 0x0804, 0x8a6d, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, 0x9294, ++ 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19b4, ++ 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, ++ 0x00f1, 0x080c, 0x788a, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, ++ 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x788a, ++ 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19b5, ++ 0x2003, 0x0000, 0x2001, 0x19bd, 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, 0x6877, ++ 0x1198, 0x2001, 0x19d0, 0x2004, 0x9005, 0x15d0, 0x0066, 0x2031, ++ 0x0001, 0x080c, 0x691e, 0x006e, 0x1118, 0x080c, 0x788a, 0x0480, ++ 0x00c6, 0x2061, 0x19b4, 0x00f0, 0x6904, 0x9194, 0x4000, 0x0568, ++ 0x0839, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, ++ 0x00c6, 0x2061, 0x19b4, 0x6128, 0x9192, 0x00c8, 0x1258, 0x8108, ++ 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x788a, 0x080c, ++ 0x8b47, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xcd1f, ++ 0x080c, 0x7893, 0x2009, 0x0014, 0x080c, 0x95ce, 0x00ce, 0x0000, ++ 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d0, 0x2004, ++ 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b4, 0x6128, 0x9192, 0x0003, ++ 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x788a, 0x080c, 0x55a0, ++ 0x0c38, 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, ++ 0x78a0, 0x2071, 0x19b4, 0x713c, 0x81ff, 0x0904, 0x8c3c, 0x2061, ++ 0x0100, 0x2069, 0x0140, 0x080c, 0x6877, 0x11b0, 0x0036, 0x2019, ++ 0x0002, 0x080c, 0x8dfe, 0x003e, 0x713c, 0x2160, 0x080c, 0xcd1f, ++ 0x2009, 0x004a, 0x080c, 0x95ce, 0x0066, 0x2031, 0x0001, 0x080c, ++ 0x691e, 0x006e, 0x0804, 0x8c3c, 0x6904, 0xd1f4, 0x0904, 0x8c43, ++ 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x00c6, ++ 0x703c, 0x9065, 0x090c, 0x0d84, 0x6020, 0x00ce, 0x9086, 0x0006, ++ 0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, 0x2104, ++ 0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, ++ 0x0002, 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, ++ 0x2809, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, ++ 0x2060, 0x2009, 0x0049, 0x080c, 0x95ce, 0x0070, 0x0036, 0x2019, ++ 0x0001, 0x080c, 0x8dfe, 0x003e, 0x713c, 0x2160, 0x080c, 0xcd1f, ++ 0x2009, 0x004a, 0x080c, 0x95ce, 0x002e, 0x001e, 0x00ee, 0x00de, ++ 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x8bf8, 0x0804, 0x8bff, ++ 0x0026, 0x00e6, 0x2071, 0x19b4, 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, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, ++ 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0, ++ 0x2071, 0x19b4, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, ++ 0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, ++ 0xad70, 0xae78, 0x009e, 0x080c, 0x5d3f, 0x0110, 0x9085, 0x0001, ++ 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, ++ 0x00be, 0x0005, 0x080c, 0x8642, 0x7003, 0x1200, 0x7820, 0x9086, ++ 0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0x1816, 0x2004, 0x700e, ++ 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x002c, 0x0804, 0x8b24, ++ 0x080c, 0x8642, 0x7003, 0x0f00, 0x7808, 0x700e, 0x60c3, 0x0008, ++ 0x0804, 0x8b24, 0x0156, 0x080c, 0x868d, 0x7003, 0x0200, 0x2011, ++ 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, ++ 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, ++ 0x0002, 0x9290, 0x0002, 0x1f04, 0x8ccb, 0x60c3, 0x001c, 0x015e, ++ 0x0804, 0x8b24, 0x0016, 0x0026, 0x080c, 0x8669, 0x080c, 0x867b, ++ 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048, ++ 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, ++ 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250, ++ 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x8b24, 0x002e, ++ 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0x934e, 0x20a1, ++ 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x8642, 0x7003, 0x6200, ++ 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x0016, 0x0026, ++ 0x080c, 0x8642, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, ++ 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, ++ 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, ++ 0x60c2, 0x080c, 0x8b24, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, ++ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, 0x700c, 0x2060, ++ 0x8cff, 0x0178, 0x080c, 0xb295, 0x1110, 0x080c, 0x9e99, 0x600c, ++ 0x0006, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8eec, 0x00ce, ++ 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee, ++ 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, ++ 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, ++ 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b4, ++ 0x7024, 0x2060, 0x8cff, 0x0904, 0x8db6, 0x080c, 0x8b50, 0x6ac0, ++ 0x68c3, 0x0000, 0x080c, 0x7893, 0x00c6, 0x2061, 0x0100, 0x080c, ++ 0x9367, 0x00ce, 0x2009, 0x0013, 0x080c, 0x95ce, 0x20a9, 0x01f4, ++ 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, ++ 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, ++ 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8d88, ++ 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, ++ 0x2004, 0x9096, 0x0001, 0x05c0, 0x9096, 0x0004, 0x05a8, 0x080c, ++ 0x7893, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, ++ 0x0008, 0x68c3, 0x0000, 0x2011, 0x554d, 0x080c, 0x781a, 0x20a9, ++ 0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084, ++ 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, ++ 0x8dd1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, ++ 0x28a5, 0x9006, 0x080c, 0x28a5, 0x000e, 0x001e, 0x002e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156, ++ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, ++ 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, ++ 0x0100, 0x2079, 0x0140, 0x2071, 0x19b4, 0x703c, 0x2060, 0x8cff, ++ 0x0904, 0x8e8f, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, ++ 0x0904, 0x8e8f, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, ++ 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x78a0, 0x080c, ++ 0x1c4f, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, ++ 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, ++ 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, ++ 0x1a33, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, ++ 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, ++ 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x194e, 0x2004, ++ 0x200a, 0x004e, 0x939d, 0x0000, 0x1120, 0x2009, 0x0049, 0x080c, ++ 0x95ce, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, ++ 0x7804, 0x9084, 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, ++ 0x0010, 0x1f04, 0x8e6b, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, ++ 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x6824, 0x000e, ++ 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, ++ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b4, 0x6a06, ++ 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, ++ 0x19b4, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x87dc, 0x7814, ++ 0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x1000, ++ 0x0478, 0x080c, 0x87dc, 0x7814, 0x080c, 0x4df2, 0x0108, 0x782c, ++ 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, 0x87dc, 0x7814, ++ 0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x2000, ++ 0x00b8, 0x080c, 0x87dc, 0x7814, 0x080c, 0x4df2, 0x0108, 0x782c, ++ 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, 0x87dc, 0x7814, ++ 0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0200, ++ 0x60c3, 0x0020, 0x0804, 0x8b24, 0x00e6, 0x2071, 0x19b4, 0x7020, ++ 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6, ++ 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2071, 0x19b4, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, ++ 0x0904, 0x8f8a, 0x8cff, 0x0904, 0x8f8a, 0x6020, 0x9086, 0x0006, ++ 0x1904, 0x8f85, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0x8f85, ++ 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0x8f85, 0x85ff, ++ 0x0120, 0x6054, 0x9106, 0x1904, 0x8f85, 0x7024, 0x9c06, 0x1578, ++ 0x2069, 0x0100, 0x68c0, 0x9005, 0x0530, 0x080c, 0x7893, 0x6820, ++ 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, ++ 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, ++ 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, ++ 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, ++ 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x0470, 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, ++ 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xb0ab, ++ 0x0110, 0x080c, 0xc970, 0x009e, 0x080c, 0x9584, 0x080c, 0x8eec, ++ 0x88ff, 0x1190, 0x00ce, 0x0804, 0x8f07, 0x2c78, 0x600c, 0x2060, ++ 0x0804, 0x8f07, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5, ++ 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066, ++ 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, 0x7638, ++ 0x2660, 0x2678, 0x8cff, 0x0904, 0x8ffe, 0x6020, 0x9086, 0x0006, ++ 0x1904, 0x8ff9, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x8ff9, ++ 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, ++ 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, ++ 0x8dfe, 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, 0x2048, 0x080c, 0xb0ab, 0x0110, ++ 0x080c, 0xc970, 0x080c, 0x9584, 0x87ff, 0x1198, 0x00ce, 0x0804, ++ 0x8faa, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8faa, 0x9006, 0x012e, ++ 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, ++ 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, ++ 0x2071, 0x19b4, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, ++ 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, ++ 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2071, 0x19b4, 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, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, ++ 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, ++ 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x90eb, 0x6010, 0x00b6, ++ 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x90e6, 0x7024, 0x9c06, ++ 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x90c2, 0x080c, ++ 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, ++ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 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, ++ 0xb284, 0x1158, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x11f0, 0x080c, ++ 0x9e99, 0x00d8, 0x080c, 0x900f, 0x08c0, 0x080c, 0xb295, 0x1118, ++ 0x080c, 0x9e99, 0x0090, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0168, ++ 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, ++ 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x080c, 0xb4de, 0x080c, ++ 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x906b, 0x2c78, 0x600c, ++ 0x2060, 0x0804, 0x906b, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, ++ 0x1d20, 0x080c, 0xc970, 0x0c08, 0x00d6, 0x080c, 0x868d, 0x7003, ++ 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, ++ 0x1956, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, ++ 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8b24, 0x00de, 0x0005, ++ 0x080c, 0x868d, 0x7003, 0x0214, 0x7007, 0x0018, 0x700b, 0x0800, ++ 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, ++ 0x782c, 0x7026, 0x60c3, 0x0018, 0x0804, 0x8b24, 0x00b6, 0x00d6, ++ 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xb6d9, 0x00de, ++ 0x1904, 0x9192, 0x080c, 0x8642, 0x7003, 0x1300, 0x782c, 0x080c, ++ 0x9294, 0x2068, 0x6820, 0x9086, 0x0003, 0x0558, 0x7810, 0x2058, ++ 0xbaa0, 0x080c, 0x94d3, 0x11d0, 0x9286, 0x007e, 0x1128, 0x700b, ++ 0x00ff, 0x700f, 0xfffe, 0x0490, 0x9286, 0x007f, 0x1128, 0x700b, ++ 0x00ff, 0x700f, 0xfffd, 0x0450, 0xd2bc, 0x0180, 0x9286, 0x0080, ++ 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, ++ 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e, ++ 0x00a8, 0x080c, 0x94d3, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, ++ 0x007e, 0x0250, 0x00d6, 0x2069, 0x181d, 0x2d04, 0x700a, 0x8d68, ++ 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, ++ 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x8b24, ++ 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, ++ 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, ++ 0x01c0, 0x9186, 0x0003, 0x0904, 0x920c, 0x9186, 0x0005, 0x0904, ++ 0x91f5, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0x91fd, ++ 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x9271, ++ 0x0005, 0x080c, 0x9232, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, ++ 0x4000, 0x6800, 0x0002, 0x91d6, 0x91e1, 0x91d8, 0x91e1, 0x91dd, ++ 0x91d6, 0x91d6, 0x91e1, 0x91e1, 0x91e1, 0x91e1, 0x91d6, 0x91d6, ++ 0x91d6, 0x91d6, 0x91d6, 0x91e1, 0x91d6, 0x91e1, 0x080c, 0x0d84, ++ 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, ++ 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x922b, 0x080c, ++ 0x9232, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, ++ 0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026, ++ 0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026, ++ 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, ++ 0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c, ++ 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, ++ 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, ++ 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, ++ 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, ++ 0x0804, 0x8b24, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, ++ 0x868d, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, ++ 0x7810, 0x2058, 0xb8a0, 0x080c, 0x94d3, 0x1118, 0x9092, 0x007e, ++ 0x0268, 0x00d6, 0x2069, 0x181d, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, ++ 0x1000, 0x2b5c, 0xbb10, 0xbc14, 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, 0x00be, ++ 0x0005, 0x080c, 0x868d, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, ++ 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x080c, 0x8639, ++ 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, ++ 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, ++ 0x60c3, 0x0010, 0x0804, 0x8b24, 0x00e6, 0x2071, 0x0240, 0x0006, ++ 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120, ++ 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, ++ 0x0005, 0x080c, 0x8684, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, ++ 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x0021, 0x60c3, 0x0000, ++ 0x0804, 0x8b24, 0x00d6, 0x080c, 0x9363, 0xb810, 0x9085, 0x0300, ++ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, ++ 0x700e, 0x7013, 0x0819, 0x080c, 0x8b12, 0x721a, 0x2f10, 0x7222, ++ 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x0059, 0x7914, ++ 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x080c, 0x8b47, 0x080c, ++ 0x788a, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7858, 0x2048, ++ 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294, ++ 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff, ++ 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870, ++ 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0x9363, ++ 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860, ++ 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035, ++ 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, ++ 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096, ++ 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001, ++ 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4, ++ 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5, ++ 0x2102, 0x2009, 0x197f, 0x210c, 0x009e, 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, ++ 0x0096, 0x6014, 0x2048, 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, ++ 0xa84a, 0x6023, 0x0003, 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, ++ 0xffff, 0xa817, 0x0001, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, ++ 0x1cdb, 0x080c, 0x7c3a, 0x0126, 0x2091, 0x8000, 0x080c, 0x820b, ++ 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, ++ 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, ++ 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9433, 0x7024, 0x9c06, ++ 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x940a, 0x080c, ++ 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, ++ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 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, ++ 0xb284, 0x1158, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x11f0, 0x080c, ++ 0x9e99, 0x00d8, 0x080c, 0x900f, 0x08c0, 0x080c, 0xb295, 0x1118, ++ 0x080c, 0x9e99, 0x0090, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0168, ++ 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, ++ 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x080c, 0xb4de, 0x080c, ++ 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x93bb, 0x2c78, 0x600c, ++ 0x2060, 0x0804, 0x93bb, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, ++ 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, ++ 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xc970, 0x08f0, 0x00d6, ++ 0x0156, 0x080c, 0x868d, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, ++ 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, ++ 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, ++ 0xc38d, 0x0060, 0x080c, 0x6877, 0x1110, 0xc3ad, 0x0008, 0xc3a5, ++ 0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011, ++ 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, ++ 0x1841, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, ++ 0x0002, 0x9290, 0x0002, 0x1f04, 0x947b, 0x60c3, 0x0040, 0x080c, ++ 0x8b24, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x868d, 0x7a14, ++ 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, ++ 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, ++ 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x198a, 0x2204, ++ 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, ++ 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181d, 0x2004, 0x7022, ++ 0x2001, 0x181e, 0x2004, 0x7026, 0x0030, 0x2001, 0x1816, 0x2004, ++ 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, ++ 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, ++ 0x015e, 0x0804, 0x8b24, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac, ++ 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, ++ 0x080c, 0x8ea3, 0x080c, 0x8d59, 0x0036, 0x901e, 0x080c, 0x8dfe, ++ 0x003e, 0x0005, 0x2071, 0x1882, 0x7000, 0x9005, 0x0140, 0x2001, ++ 0x0976, 0x2071, 0x1800, 0x706e, 0x7072, 0x7063, 0xffe0, 0x2071, ++ 0x1800, 0x706c, 0x704e, 0x7053, 0x1cd0, 0x0005, 0x00e6, 0x0126, ++ 0x2071, 0x1800, 0x2091, 0x8000, 0x754c, 0x9582, 0x0010, 0x0608, ++ 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, ++ 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, ++ 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230, ++ 0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7053, 0x1cd0, ++ 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x754c, 0x9582, ++ 0x0010, 0x0600, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, ++ 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, ++ 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, ++ 0x9502, 0x1228, 0x7552, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7053, ++ 0x1cd0, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0d84, ++ 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a0c, 0x0d84, 0x9006, 0x6006, ++ 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, ++ 0x0000, 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, ++ 0x6036, 0x603a, 0x603e, 0x6042, 0x2061, 0x1800, 0x604c, 0x8000, ++ 0x604e, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x8125, 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, ++ 0x01b0, 0x601c, 0xd084, 0x190c, 0x17b0, 0x6017, 0x0000, 0x6023, ++ 0x0007, 0x2001, 0x1953, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, ++ 0x0208, 0x8004, 0x601a, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x000e, ++ 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x754c, ++ 0x9582, 0x0001, 0x0608, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, ++ 0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, ++ 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, ++ 0x7060, 0x9502, 0x1230, 0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, ++ 0x0005, 0x7053, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, ++ 0x000f, 0x0002, 0x95e1, 0x95ea, 0x9605, 0x9620, 0xb77d, 0xb79a, ++ 0xb7b5, 0x95e1, 0x95ea, 0x95e1, 0x963c, 0x95e1, 0x95e1, 0x95e1, ++ 0x95e1, 0x9186, 0x0013, 0x1128, 0x080c, 0x8026, 0x080c, 0x8125, ++ 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d84, ++ 0x0013, 0x006e, 0x0005, 0x9603, 0x9d1f, 0x9ee0, 0x9603, 0x9f6e, ++ 0x98e8, 0x9603, 0x9603, 0x9ca1, 0xa463, 0x9603, 0x9603, 0x9603, ++ 0x9603, 0x9603, 0x9603, 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, ++ 0x0016, 0x1a0c, 0x0d84, 0x0013, 0x006e, 0x0005, 0x961e, 0xaaef, ++ 0x961e, 0x961e, 0x961e, 0x961e, 0x961e, 0x961e, 0xaa94, 0xac61, ++ 0x961e, 0xab21, 0xaba0, 0xab21, 0xaba0, 0x961e, 0x080c, 0x0d84, ++ 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d84, 0x6000, 0x0002, 0x963a, ++ 0xa4a5, 0xa574, 0xa69f, 0xa838, 0x963a, 0x963a, 0x963a, 0xa47e, ++ 0xaa2b, 0xaa2e, 0x963a, 0x963a, 0x963a, 0x963a, 0xaa57, 0x963a, ++ 0x963a, 0x963a, 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, 0x0016, ++ 0x1a0c, 0x0d84, 0x0013, 0x006e, 0x0005, 0x9655, 0x9655, 0x9694, ++ 0x972f, 0x979c, 0x9655, 0x9655, 0x9655, 0x9657, 0x9655, 0x9655, ++ 0x9655, 0x9655, 0x9655, 0x9655, 0x9655, 0x080c, 0x0d84, 0x9186, ++ 0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0d84, 0x0096, 0x601c, ++ 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, ++ 0x9084, 0x8000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, ++ 0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, ++ 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10, ++ 0x080c, 0x18b7, 0x080c, 0x7c3a, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x820b, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, ++ 0x2c00, 0x080c, 0x97be, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, ++ 0x1800, 0x7a88, 0x9290, 0x0018, 0x6014, 0x2048, 0xac78, 0x0046, ++ 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, ++ 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, ++ 0x8214, 0xa883, 0x0000, 0xaa02, 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, 0x96f7, 0x96f7, 0x96f2, 0x96f5, 0x96f7, 0x96ef, ++ 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, ++ 0x96e2, 0x96e2, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, ++ 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d84, 0x080c, ++ 0xa0f1, 0x0028, 0x080c, 0xa1cf, 0x0010, 0x080c, 0xa2bc, 0x00fe, ++ 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, ++ 0x080c, 0x987c, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, ++ 0x00ae, 0x8006, 0x8006, 0x8007, 0x97bc, 0x003f, 0x9084, 0xffc0, ++ 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, ++ 0x2041, 0x11fd, 0x080c, 0x9a1f, 0x0160, 0x000e, 0x9005, 0x0120, ++ 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, ++ 0x9554, 0x2001, 0x002c, 0x900e, 0x080c, 0x98db, 0x0c70, 0x9182, ++ 0x0047, 0x0002, 0x973b, 0x973b, 0x973d, 0x9772, 0x973b, 0x973b, ++ 0x973b, 0x973b, 0x9785, 0x080c, 0x0d84, 0x00d6, 0x0016, 0x0096, ++ 0x080c, 0x80d6, 0x080c, 0x820b, 0x6003, 0x0004, 0x6114, 0x2148, ++ 0xa87c, 0xd0fc, 0x01b8, 0xa878, 0x9005, 0x1158, 0xa894, 0x9005, ++ 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0x98db, 0x080c, 0x9554, ++ 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae, ++ 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, ++ 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e, ++ 0x00de, 0x0005, 0x080c, 0x80d6, 0x00d6, 0x0096, 0x6114, 0x2148, ++ 0x080c, 0xb0ad, 0x0120, 0xa87b, 0x0006, 0x080c, 0x61a9, 0x009e, ++ 0x00de, 0x080c, 0x9554, 0x0804, 0x820b, 0x080c, 0x80d6, 0x080c, ++ 0x2d1a, 0x080c, 0xb76c, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, ++ 0xb0ad, 0x0120, 0xa87b, 0x0029, 0x080c, 0x61a9, 0x009e, 0x00de, ++ 0x080c, 0x9554, 0x0804, 0x820b, 0x9182, 0x0047, 0x0002, 0x97ac, ++ 0x97ae, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, ++ 0x97ac, 0x97ac, 0x97ac, 0x97ae, 0x080c, 0x0d84, 0x00d6, 0x0096, ++ 0x080c, 0x1489, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, ++ 0x080c, 0x61a9, 0x009e, 0x00de, 0x0804, 0x9554, 0x0026, 0x0036, ++ 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x0fae, ++ 0x000e, 0x090c, 0x0d84, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, ++ 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, ++ 0x7988, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, ++ 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, ++ 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xace6, 0x04c0, ++ 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xace6, 0x96b2, ++ 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0f60, 0x080c, 0x0fae, ++ 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, ++ 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xace6, ++ 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, ++ 0x080c, 0xace6, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, ++ 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048, ++ 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, ++ 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x61a9, ++ 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, ++ 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, ++ 0x080c, 0x0fae, 0x000e, 0x090c, 0x0d84, 0xa960, 0x21e8, 0xa95c, ++ 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, ++ 0xa87a, 0x2079, 0x1800, 0x7988, 0x810c, 0x9188, 0x000c, 0x9182, ++ 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, 0xac76, ++ 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, 0x200c, ++ 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x61a9, ++ 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, ++ 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, ++ 0x2079, 0x0200, 0x2e98, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, ++ 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, ++ 0x080c, 0x0fae, 0x2900, 0x009e, 0x05b8, 0xa806, 0x2048, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, ++ 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, ++ 0x9318, 0x2200, 0x9402, 0x1220, 0x2410, 0x9006, 0x9398, 0x0002, ++ 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, ++ 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, ++ 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0x988b, ++ 0x0804, 0x988d, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, ++ 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, ++ 0xa87a, 0xa982, 0x080c, 0x619c, 0x009e, 0x003e, 0x00de, 0x0005, ++ 0x91b6, 0x0015, 0x1118, 0x080c, 0x9554, 0x0030, 0x91b6, 0x0016, ++ 0x190c, 0x0d84, 0x080c, 0x9554, 0x0005, 0x20a9, 0x000e, 0x20e1, ++ 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, ++ 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006, ++ 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318, ++ 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318, ++ 0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8, ++ 0x0096, 0x080c, 0xb0ad, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, ++ 0xa867, 0x0103, 0x009e, 0x0804, 0x9554, 0x0096, 0x00d6, 0x0036, ++ 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8bf, ++ 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, ++ 0xa867, 0x0103, 0xab32, 0x080c, 0x9554, 0x003e, 0x00de, 0x009e, ++ 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xb759, ++ 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, ++ 0x6043, 0x0000, 0x2009, 0x0022, 0x080c, 0x9cf7, 0x9006, 0x001e, ++ 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9, ++ 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048, ++ 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, ++ 0x0205, 0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016, 0x4003, ++ 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, ++ 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099, ++ 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048, ++ 0xa800, 0x2048, 0xa867, 0x0103, 0x080c, 0x9554, 0x001e, 0x009e, ++ 0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140, ++ 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004, ++ 0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c, ++ 0x6014, 0x2048, 0x080c, 0xace6, 0x080c, 0xb0ad, 0x0140, 0x6014, ++ 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, ++ 0x9554, 0x001e, 0x009e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, ++ 0x0100, 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, ++ 0x2011, 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, ++ 0x9005, 0x0108, 0x2048, 0x080c, 0xace6, 0x009e, 0x080c, 0xb0ad, ++ 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, ++ 0xa867, 0x0103, 0x080c, 0x9554, 0x009e, 0x001e, 0x0005, 0x0086, ++ 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0x9e99, ++ 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, ++ 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, ++ 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, ++ 0x0000, 0x2041, 0x11e3, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, ++ 0x0006, 0x080c, 0x0fae, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, ++ 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, ++ 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x108c, ++ 0x008e, 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, ++ 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, ++ 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, ++ 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, ++ 0x080c, 0xb6d9, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, ++ 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, ++ 0x9554, 0x0020, 0x0039, 0x0010, 0x080c, 0x9b31, 0x002e, 0x00de, ++ 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, ++ 0x9b19, 0x918e, 0x0016, 0x1904, 0x9b2f, 0x700c, 0x908c, 0xff00, ++ 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0x9af3, 0x89ff, ++ 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0x9ad6, 0x0804, 0x9b2d, ++ 0x6808, 0x9086, 0xffff, 0x1904, 0x9b1b, 0xa87c, 0x9084, 0x0060, ++ 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0x9b1b, ++ 0x6824, 0xd0b4, 0x1904, 0x9b1b, 0x080c, 0xb278, 0x685c, 0xa882, ++ 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, ++ 0x2001, 0x000a, 0x080c, 0x7a4b, 0xa884, 0x920a, 0x0208, 0x8011, ++ 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xae04, ++ 0x00ce, 0x0804, 0x9b2d, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, ++ 0x5755, 0x0010, 0x080c, 0x5ac6, 0x00ce, 0x1904, 0x9b1b, 0x00c6, ++ 0x2d60, 0x080c, 0x9554, 0x00ce, 0x0804, 0x9b2d, 0x00c6, 0x080c, ++ 0x95a1, 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xb4e6, ++ 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x9554, 0x00ce, ++ 0x080c, 0x95ce, 0x00ce, 0x0804, 0x9b2d, 0x2001, 0x1955, 0x2004, ++ 0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, ++ 0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, ++ 0xa883, 0x0003, 0x080c, 0xb71f, 0x6007, 0x0085, 0x6003, 0x000b, ++ 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ce, 0x00e8, ++ 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, 0x1955, 0x2004, 0x6842, ++ 0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0d84, 0x00c6, 0x00d6, ++ 0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0xacd6, 0x080c, ++ 0xb278, 0x080c, 0x9584, 0x00de, 0x00ce, 0x080c, 0x9554, 0x009e, ++ 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1955, 0x2004, 0x6842, ++ 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, ++ 0xcc1f, 0x080c, 0x79df, 0x080c, 0x9554, 0x00ce, 0x080c, 0x9554, ++ 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, ++ 0x0130, 0x2001, 0x1955, 0x2004, 0x6842, 0x0804, 0x9ba9, 0x00c6, ++ 0x2d60, 0x080c, 0xad11, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, ++ 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x00ce, 0x04e0, 0x6800, 0x9086, 0x000f, ++ 0x01b0, 0x89ff, 0x090c, 0x0d84, 0x6800, 0x9086, 0x0004, 0x1198, ++ 0xa87c, 0xd0ac, 0x0180, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, ++ 0xc0f4, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x00e8, 0x2001, ++ 0x0007, 0x6832, 0x00c8, 0xa87c, 0xd0b4, 0x1138, 0xd0ac, 0x0db8, ++ 0xa838, 0xa934, 0x9105, 0x0d98, 0x0c30, 0xd2ec, 0x1d80, 0x7024, ++ 0x9306, 0x1118, 0x7020, 0x9406, 0x0d50, 0x7020, 0x683e, 0x7024, ++ 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xb3e0, 0x080c, 0x8125, ++ 0x0010, 0x080c, 0x9554, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, ++ 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, ++ 0xba10, 0x00be, 0x9206, 0x1904, 0x9c11, 0x700c, 0x6210, 0x00b6, ++ 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0x9c11, 0x6038, 0x2068, ++ 0x6a20, 0x9286, 0x0007, 0x0904, 0x9c11, 0x9286, 0x0002, 0x0904, ++ 0x9c11, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, ++ 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, ++ 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, ++ 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, ++ 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xb0ad, ++ 0x090c, 0x0d84, 0xa883, 0x0003, 0x009e, 0x080c, 0xb71f, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1955, 0x2004, ++ 0x7042, 0x080c, 0x9554, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, ++ 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, ++ 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, ++ 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, ++ 0x20a9, 0x0004, 0x080c, 0xa439, 0x002e, 0x003e, 0x015e, 0x009e, ++ 0x1904, 0x9c80, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, ++ 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa439, 0x002e, ++ 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, ++ 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, ++ 0x00be, 0x0804, 0x9920, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, ++ 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, ++ 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, ++ 0x2031, 0x0000, 0x2041, 0x11e3, 0x080c, 0x9a1f, 0x0130, 0x00fe, ++ 0x009e, 0x080c, 0x9554, 0x00be, 0x0005, 0x080c, 0x9e99, 0x0cb8, ++ 0x2b78, 0x00f6, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x00fe, 0x00c6, ++ 0x080c, 0x94fe, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, ++ 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5b61, ++ 0x080c, 0x5b8d, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00ce, 0x0804, ++ 0x9c53, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d84, 0x91b2, 0x0040, ++ 0x1a04, 0x9d09, 0x0002, 0x9cf7, 0x9cf7, 0x9ced, 0x9cf7, 0x9cf7, ++ 0x9cf7, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9cf7, 0x9ceb, 0x9cf7, 0x9cf7, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ced, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9cf7, 0x9cf7, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9cf7, 0x9ceb, 0x9ceb, 0x080c, 0x0d84, 0x0066, 0x00b6, 0x6610, ++ 0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, 0x6003, ++ 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x7c1d, 0x0010, ++ 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, ++ 0x0005, 0x2600, 0x0002, 0x9d1d, 0x9d1d, 0x9d1d, 0x9cf7, 0x9cf7, ++ 0x9d1d, 0x9d1d, 0x9d1d, 0x9d1d, 0x9cf7, 0x9d1d, 0x9cf7, 0x9d1d, ++ 0x9cf7, 0x9d1d, 0x9d1d, 0x9d1d, 0x9d1d, 0x080c, 0x0d84, 0x6004, ++ 0x90b2, 0x0053, 0x1a0c, 0x0d84, 0x91b6, 0x0013, 0x0904, 0x9dd4, ++ 0x91b6, 0x0027, 0x1904, 0x9d8f, 0x080c, 0x8026, 0x6004, 0x080c, ++ 0xb284, 0x01a8, 0x080c, 0xb295, 0x01a0, 0x908e, 0x0021, 0x0904, ++ 0x9d8c, 0x908e, 0x0022, 0x1130, 0x080c, 0x994c, 0x0904, 0x9d88, ++ 0x0804, 0x9d89, 0x908e, 0x003d, 0x0904, 0x9d8c, 0x04d8, 0x080c, ++ 0x2d3f, 0x2001, 0x0007, 0x080c, 0x5b61, 0x6010, 0x00b6, 0x2058, ++ 0xb9a0, 0x00be, 0x080c, 0x9e99, 0x9186, 0x007e, 0x1148, 0x2001, ++ 0x1836, 0x2014, 0xc285, 0x080c, 0x6877, 0x1108, 0xc2ad, 0x2202, ++ 0x0036, 0x2019, 0x0028, 0x080c, 0x2e2f, 0x003e, 0x0016, 0x0026, ++ 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x7d55, 0x0076, 0x903e, ++ 0x080c, 0x7c4d, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, ++ 0x080c, 0xc73e, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xb76c, ++ 0x080c, 0x5bd1, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8125, ++ 0x0005, 0x080c, 0x9e99, 0x0cb0, 0x080c, 0x9ed5, 0x0c98, 0x9186, ++ 0x0014, 0x1db0, 0x080c, 0x8026, 0x6004, 0x908e, 0x0022, 0x1118, ++ 0x080c, 0x994c, 0x0d68, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x080c, ++ 0xb284, 0x1190, 0x080c, 0x2d3f, 0x6010, 0x00b6, 0x2058, 0xb9a0, ++ 0x00be, 0x080c, 0x9e99, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, ++ 0x200c, 0xc185, 0x2102, 0x0870, 0x080c, 0xb295, 0x1118, 0x080c, ++ 0x9e99, 0x0840, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, ++ 0x2071, 0x1893, 0x2079, 0x0000, 0x080c, 0x308f, 0x00fe, 0x00ee, ++ 0x0804, 0x9d82, 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, ++ 0x090c, 0x9e99, 0x0804, 0x9d82, 0x90b2, 0x0040, 0x1a04, 0x9e82, ++ 0x2008, 0x0002, 0x9e1c, 0x9e1d, 0x9e20, 0x9e23, 0x9e26, 0x9e29, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e2c, 0x9e37, 0x9e1a, 0x9e39, 0x9e37, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e37, 0x9e37, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e69, 0x9e37, 0x9e1a, 0x9e33, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e34, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e37, ++ 0x9e60, 0x9e1a, 0x080c, 0x0d84, 0x00d0, 0x2001, 0x000b, 0x0410, ++ 0x2001, 0x0003, 0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, ++ 0x00c8, 0x2001, 0x0009, 0x00b0, 0x080c, 0x8026, 0x6003, 0x0005, ++ 0x080c, 0x8125, 0x0070, 0x0018, 0x0010, 0x080c, 0x5b61, 0x0804, ++ 0x9e7a, 0x080c, 0x8026, 0x080c, 0xb76f, 0x6003, 0x0004, 0x080c, ++ 0x8125, 0x0005, 0x080c, 0x5b61, 0x080c, 0x8026, 0x6003, 0x0002, ++ 0x0036, 0x2019, 0x185d, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, ++ 0x1953, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, ++ 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x8125, 0x0c08, ++ 0x080c, 0x8026, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8125, ++ 0x08c0, 0x00e6, 0x00f6, 0x2071, 0x1893, 0x2079, 0x0000, 0x080c, ++ 0x308f, 0x00fe, 0x00ee, 0x080c, 0x8026, 0x080c, 0x9554, 0x080c, ++ 0x8125, 0x0838, 0x080c, 0x8026, 0x6003, 0x0002, 0x080c, 0xb76f, ++ 0x0804, 0x8125, 0x2600, 0x2008, 0x0002, 0x9e97, 0x9e97, 0x9e97, ++ 0x9e7a, 0x9e7a, 0x9e97, 0x9e97, 0x9e97, 0x9e97, 0x9e7a, 0x9e97, ++ 0x9e7a, 0x9e97, 0x9e7a, 0x9e97, 0x9e97, 0x9e97, 0x9e97, 0x080c, ++ 0x0d84, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xb0ad, 0x0568, ++ 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, ++ 0x0056, 0x1148, 0x080c, 0x4b95, 0x0130, 0x2001, 0x0000, 0x900e, ++ 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, ++ 0x080c, 0xb644, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, ++ 0x0016, 0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, ++ 0x001e, 0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, ++ 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, ++ 0xa800, 0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, ++ 0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, ++ 0x1a0c, 0x0d84, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xb56a, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xb5b3, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xb5df, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xb500, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xb2c4, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xb305, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0x98f5, ++ 0x04e0, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0x9c17, 0x04a8, ++ 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0x992d, 0x0470, 0x6604, ++ 0x96b6, 0x0035, 0x1118, 0x080c, 0x9a3d, 0x0438, 0x6604, 0x96b6, ++ 0x0039, 0x1118, 0x080c, 0x9baf, 0x0400, 0x6604, 0x96b6, 0x003d, ++ 0x1118, 0x080c, 0x9965, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, ++ 0x080c, 0x99a1, 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, ++ 0x99cc, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, ++ 0x0016, 0x1128, 0x00be, 0x0804, 0xa178, 0x00be, 0x0005, 0x080c, ++ 0x95e9, 0x0cd8, 0x9f7a, 0x9f7d, 0x9f7a, 0x9fc2, 0x9f7a, 0xa0f1, ++ 0xa185, 0x9f7a, 0x9f7a, 0xa152, 0x9f7a, 0xa166, 0x0096, 0x080c, ++ 0x1489, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, ++ 0x0804, 0x9554, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, ++ 0x7088, 0x9086, 0x0074, 0x1540, 0x080c, 0xc70f, 0x11b0, 0x6010, ++ 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, ++ 0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x5b61, ++ 0x080c, 0x2d3f, 0x080c, 0x9554, 0x0088, 0x2001, 0x000a, 0x080c, ++ 0x5b61, 0x080c, 0x2d3f, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0010, 0x080c, 0xa0dc, 0x00ee, 0x0005, ++ 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x5b4d, 0x2069, ++ 0x1852, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x5b8d, ++ 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1822, 0x2204, ++ 0x9086, 0x0074, 0x1904, 0xa0c0, 0x6010, 0x2058, 0xbaa0, 0x9286, ++ 0x007e, 0x1120, 0x080c, 0xa2c7, 0x0804, 0xa025, 0x080c, 0xa2bc, ++ 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, ++ 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, ++ 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xb644, 0x0030, ++ 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, ++ 0x080c, 0x5b61, 0x080c, 0x2d3f, 0x080c, 0x9554, 0x0804, 0xa0c1, ++ 0x080c, 0xa0c5, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, ++ 0x0170, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, ++ 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xb644, 0x08f8, 0x2001, ++ 0x0004, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0804, 0xa0c1, 0xb85c, 0xd0e4, 0x01d0, ++ 0x080c, 0xb480, 0x080c, 0x6877, 0x0110, 0xd0dc, 0x1938, 0x2011, ++ 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x193c, 0x2004, 0x00f6, ++ 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2471, 0x78e2, 0x00fe, ++ 0x0804, 0x9ff6, 0x080c, 0xb4bd, 0x2011, 0x1836, 0x2204, 0xc0a5, ++ 0x2012, 0x0006, 0x080c, 0xc860, 0x000e, 0x1904, 0x9ff6, 0xc0b5, ++ 0x2012, 0x2001, 0x0006, 0x080c, 0x5b61, 0x9006, 0x080c, 0x5b4d, ++ 0x00c6, 0x2001, 0x180e, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, ++ 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, ++ 0x7076, 0x7010, 0x78ea, 0x707a, 0x908c, 0x00ff, 0x00ee, 0x780c, ++ 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2446, 0x00f6, 0x2100, 0x900e, ++ 0x080c, 0x23fd, 0x7956, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, ++ 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, ++ 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2446, ++ 0x00f6, 0x2079, 0x1800, 0x797a, 0x2100, 0x900e, 0x080c, 0x23fd, ++ 0x7956, 0x00fe, 0x8108, 0x080c, 0x5bb0, 0x2b00, 0x00ce, 0x1904, ++ 0x9ff6, 0x6012, 0x2009, 0x180e, 0x210c, 0xd19c, 0x0150, 0x2009, ++ 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, ++ 0xb916, 0x2001, 0x0002, 0x080c, 0x5b61, 0x6023, 0x0001, 0x6003, ++ 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x0008, ++ 0x00d9, 0x00de, 0x009e, 0x00be, 0x0005, 0x00e6, 0x080c, 0xccd1, ++ 0x0188, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, ++ 0x9284, 0xff00, 0x0138, 0x6010, 0x2058, 0xb8a0, 0xd0bc, 0x1110, ++ 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, ++ 0x5b61, 0x080c, 0x4dfe, 0x1120, 0x2001, 0x0007, 0x080c, 0x5b8d, ++ 0x080c, 0x2d3f, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, ++ 0x9554, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7088, ++ 0x9086, 0x0014, 0x1904, 0xa149, 0x080c, 0x4dfe, 0x1170, 0x6014, ++ 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, ++ 0x0006, 0x080c, 0x44f9, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, ++ 0x080c, 0x5ca8, 0x080c, 0x9fb0, 0x00de, 0x080c, 0xa38d, 0x1588, ++ 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, ++ 0x5b61, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, ++ 0x080c, 0xb644, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, ++ 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, ++ 0x080c, 0x2d3f, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9554, ++ 0x0020, 0x080c, 0x9e99, 0x080c, 0xa0dc, 0x001e, 0x002e, 0x00ee, ++ 0x00be, 0x0005, 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x1160, ++ 0x2001, 0x0002, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0001, ++ 0x080c, 0x7c1d, 0x0804, 0x8125, 0x0804, 0xa0dc, 0x2030, 0x2011, ++ 0x1822, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, ++ 0x2001, 0x0007, 0x080c, 0x5b61, 0x0804, 0x9554, 0x0804, 0xa0dc, ++ 0x0002, 0x9f7a, 0xa190, 0x9f7a, 0xa1cf, 0x9f7a, 0xa278, 0xa185, ++ 0x9f7a, 0x9f7a, 0xa28b, 0x9f7a, 0xa29b, 0x6604, 0x9686, 0x0003, ++ 0x0904, 0xa0f1, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9554, 0x0005, ++ 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xa2ab, 0x11a0, 0x9006, 0x080c, ++ 0x5b4d, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x2001, 0x0002, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, ++ 0x8125, 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, ++ 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, ++ 0xb842, 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, ++ 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2d1a, 0x080c, ++ 0xb76c, 0x080c, 0xa0dc, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, ++ 0x00b6, 0x0026, 0x9016, 0x080c, 0xa2b9, 0x00d6, 0x2069, 0x194b, ++ 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, ++ 0x1138, 0x2069, 0x181e, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, ++ 0x00de, 0x0088, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, ++ 0x8125, 0x0804, 0xa248, 0x080c, 0xb0ad, 0x01a0, 0x6014, 0x2048, ++ 0xa864, 0x2010, 0x9086, 0x0139, 0x1128, 0x2001, 0x0002, 0x080c, ++ 0xb69a, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, ++ 0x0001, 0x0ca8, 0x2001, 0x180d, 0x2004, 0xd0dc, 0x0148, 0x6010, ++ 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, ++ 0x080c, 0x9e99, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, ++ 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, ++ 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, 0x1900, ++ 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, 0x5b61, ++ 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0xa0dc, ++ 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, ++ 0x2048, 0x080c, 0xb0ad, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118, ++ 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, 0x9084, ++ 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007, ++ 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, ++ 0x1800, 0x080c, 0x5677, 0x00ee, 0x0010, 0x080c, 0x2d1a, 0x0870, ++ 0x080c, 0xa2b9, 0x1160, 0x2001, 0x0004, 0x080c, 0x5b61, 0x6003, ++ 0x0001, 0x6007, 0x0003, 0x080c, 0x7c1d, 0x0804, 0x8125, 0x080c, ++ 0x9e99, 0x0804, 0xa0dc, 0x0469, 0x1160, 0x2001, 0x0008, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x7c1d, 0x0804, ++ 0x8125, 0x0804, 0xa0dc, 0x00e9, 0x1160, 0x2001, 0x000a, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x7c1d, 0x0804, ++ 0x8125, 0x0804, 0xa0dc, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, ++ 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, ++ 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, ++ 0x2158, 0x080c, 0x5c1c, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, ++ 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, ++ 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xa35f, 0x0560, ++ 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x5f29, 0x0158, ++ 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xc9c5, 0x2001, 0x180c, ++ 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, ++ 0x2ce5, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2b1e, 0x00ee, 0x00c6, ++ 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x2e11, 0x8108, ++ 0x1f04, 0xa2fd, 0x015e, 0x00ce, 0x080c, 0xa2bc, 0x2071, 0x0260, ++ 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, 0xc1c5, ++ 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, ++ 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079, 0x0100, ++ 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181d, 0x206a, 0x78e6, 0x0006, ++ 0x8e70, 0x2e04, 0x2069, 0x181e, 0x206a, 0x78ea, 0x7832, 0x7836, ++ 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182a, 0x200a, ++ 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2446, 0x080c, 0x6877, ++ 0x0170, 0x2071, 0x0260, 0x2069, 0x194f, 0x7048, 0x206a, 0x704c, ++ 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xb480, 0x0040, ++ 0x2001, 0x0006, 0x080c, 0x5b61, 0x080c, 0x2d3f, 0x080c, 0x9554, ++ 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, ++ 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182a, 0x231c, 0x83ff, ++ 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, ++ 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, ++ 0x2b48, 0x2019, 0x000a, 0x080c, 0xa439, 0x1148, 0x2011, 0x027a, ++ 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xa439, 0x1100, 0x015e, ++ 0x00ee, 0x003e, 0x002e, 0x009e, 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, 0x0096, 0x00c6, 0x0076, 0x0056, ++ 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bd, ++ 0x252c, 0x2021, 0x19c3, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, ++ 0x724c, 0x706c, 0x9202, 0x1a04, 0xa411, 0x080c, 0xc9f1, 0x0904, ++ 0xa40a, 0x6720, 0x9786, 0x0007, 0x05e8, 0x2500, 0x9c06, 0x05d0, ++ 0x2400, 0x9c06, 0x05b8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, ++ 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1550, ++ 0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x17b0, 0x9786, ++ 0x0008, 0x1148, 0x080c, 0xb295, 0x1130, 0x00ce, 0x080c, 0x9e99, ++ 0x080c, 0x9584, 0x00b8, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0178, ++ 0x9786, 0x0003, 0x1500, 0x080c, 0xc810, 0x0110, 0xa867, 0x0103, ++ 0xab7a, 0xa877, 0x0000, 0x080c, 0x619c, 0x080c, 0xb278, 0x080c, ++ 0x9584, 0x00ce, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1210, 0x0804, ++ 0xa3c0, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, ++ 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xc970, ++ 0x0c30, 0x9786, 0x000a, 0x09e0, 0x08b0, 0x220c, 0x2304, 0x9106, ++ 0x1130, 0x8210, 0x8318, 0x1f04, 0xa425, 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, 0x0d84, ++ 0x080c, 0xb284, 0x0120, 0x080c, 0xb295, 0x0168, 0x0028, 0x080c, ++ 0x2d3f, 0x080c, 0xb295, 0x0138, 0x080c, 0x8026, 0x080c, 0x9554, ++ 0x080c, 0x8125, 0x0005, 0x080c, 0x9e99, 0x0cb0, 0x9182, 0x0040, ++ 0x0002, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, ++ 0xa495, 0xa495, 0xa495, 0xa495, 0xa497, 0xa497, 0xa497, 0xa497, ++ 0xa495, 0xa495, 0xa495, 0xa497, 0xa495, 0x080c, 0x0d84, 0x600b, ++ 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, ++ 0x6004, 0x9082, 0x0040, 0x0804, 0xa536, 0x9186, 0x0027, 0x11f0, ++ 0x080c, 0x8026, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x0096, 0x6114, ++ 0x2148, 0x080c, 0xb0ad, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0029, ++ 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x61a9, 0x080c, ++ 0xb278, 0x009e, 0x080c, 0x9554, 0x0804, 0x8125, 0x9186, 0x0014, ++ 0x1120, 0x6004, 0x9082, 0x0040, 0x0440, 0x9186, 0x0046, 0x0150, ++ 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, ++ 0x190c, 0x0d84, 0x2001, 0x0109, 0x2004, 0xd084, 0x01a8, 0x0126, ++ 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x080c, 0x7ab7, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, ++ 0x0002, 0x1110, 0x0804, 0xa574, 0x0005, 0x0002, 0xa514, 0xa512, ++ 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, ++ 0xa512, 0xa52f, 0xa52f, 0xa52f, 0xa52f, 0xa512, 0xa52f, 0xa512, ++ 0xa52f, 0xa512, 0x080c, 0x0d84, 0x080c, 0x8026, 0x0096, 0x6114, ++ 0x2148, 0x080c, 0xb0ad, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, ++ 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x61a9, 0x080c, ++ 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, 0x080c, ++ 0x8026, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, 0x0002, 0xa54d, ++ 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, ++ 0xa54b, 0xa54b, 0xa564, 0xa564, 0xa564, 0xa564, 0xa54b, 0xa56e, ++ 0xa54b, 0xa564, 0xa54b, 0x080c, 0x0d84, 0x0096, 0x080c, 0x8026, ++ 0x6014, 0x2048, 0x2001, 0x1955, 0x2004, 0x6042, 0xa97c, 0xd1ac, ++ 0x0140, 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, ++ 0x0005, 0x6003, 0x0002, 0x0cb8, 0x080c, 0x8026, 0x080c, 0xb76f, ++ 0x080c, 0xb774, 0x6003, 0x000f, 0x0804, 0x8125, 0x080c, 0x8026, ++ 0x080c, 0x9554, 0x0804, 0x8125, 0x9182, 0x0040, 0x0002, 0xa58b, ++ 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58d, 0xa66a, 0xa58b, 0xa58b, ++ 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, ++ 0xa58b, 0xa58b, 0xa69e, 0x080c, 0x0d84, 0x00b6, 0x0096, 0x6114, ++ 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, 0x2058, ++ 0xb800, 0xd0bc, 0x1904, 0xa659, 0xa87b, 0x0000, 0xa867, 0x0103, ++ 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, ++ 0xa82a, 0x080c, 0x5fda, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, ++ 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xa63d, 0x080c, 0x9554, ++ 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, ++ 0xb800, 0xd0bc, 0x1904, 0xa641, 0x7348, 0xab92, 0x734c, 0xab8e, ++ 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118, ++ 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c, ++ 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0148, 0x7048, ++ 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992, 0xaa8e, 0xc6dc, ++ 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, ++ 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, ++ 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0xa594, 0x735c, ++ 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, ++ 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xace6, ++ 0x003e, 0xd6cc, 0x0904, 0xa5a9, 0x7154, 0xa98a, 0x81ff, 0x0904, ++ 0xa5a9, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, ++ 0x0029, 0x080c, 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, ++ 0xb706, 0x0804, 0xa5a9, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, ++ 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xac85, 0x00ae, 0x080c, ++ 0xb706, 0x080c, 0xacd6, 0x0804, 0xa5ab, 0x080c, 0xb37e, 0x0804, ++ 0xa5b8, 0xa87c, 0xd0ac, 0x0904, 0xa5c4, 0xa880, 0xd0bc, 0x1904, ++ 0xa5c4, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, ++ 0x0904, 0xa5c4, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xa5c4, ++ 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xa59c, 0xa838, 0xa934, 0x9105, ++ 0x0904, 0xa59c, 0xa880, 0xd0bc, 0x1904, 0xa59c, 0x080c, 0xb3ae, ++ 0x0804, 0xa5b8, 0x0096, 0x00f6, 0x6003, 0x0003, 0x6007, 0x0043, ++ 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2048, ++ 0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe, 0x009e, 0x0005, ++ 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, ++ 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac36, 0xab3a, ++ 0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000, 0x2c10, 0x080c, 0x18b7, ++ 0x080c, 0x7c3a, 0x080c, 0x820b, 0x009e, 0x0005, 0x0005, 0x9182, ++ 0x0040, 0x0002, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b8, ++ 0xa74e, 0xa6b6, 0xa6b6, 0xa765, 0xa7f1, 0xa6b6, 0xa6b6, 0xa6b6, ++ 0xa6b6, 0xa806, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0x080c, 0x0d84, ++ 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, ++ 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, ++ 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, ++ 0x86ff, 0x0904, 0xa749, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, ++ 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xa749, ++ 0x080c, 0x0fae, 0x090c, 0x0d84, 0x2900, 0xb07a, 0xb77c, 0xc7cd, ++ 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, ++ 0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, ++ 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, ++ 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, ++ 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, ++ 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, ++ 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, ++ 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, ++ 0xace6, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, ++ 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, ++ 0x080c, 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, ++ 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, ++ 0xac85, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6, ++ 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, ++ 0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe, ++ 0x2c10, 0x080c, 0x18b7, 0x0804, 0x8b1d, 0x6003, 0x0002, 0x6004, ++ 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, ++ 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c, ++ 0x150d, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e, ++ 0x080c, 0x8026, 0x080c, 0x8125, 0x0096, 0x2001, 0x1955, 0x2004, ++ 0x6042, 0x080c, 0x80d6, 0x080c, 0x820b, 0x6114, 0x2148, 0xa97c, ++ 0xd1e4, 0x0904, 0xa7ec, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc, ++ 0x0538, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8, ++ 0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184, ++ 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156, ++ 0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, 0xa87e, ++ 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0f60, 0x001e, 0x0440, ++ 0x0016, 0x080c, 0x0f60, 0x009e, 0xa974, 0x0016, 0x080c, 0xacd6, ++ 0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, ++ 0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, ++ 0xd1dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b, ++ 0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x5fda, 0x001e, ++ 0xd1e4, 0x1120, 0x080c, 0x9554, 0x009e, 0x0005, 0x080c, 0xb37e, ++ 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8026, 0x080c, ++ 0x8125, 0x2019, 0x0001, 0x080c, 0x8dfe, 0x6003, 0x0002, 0x080c, ++ 0xb774, 0x080c, 0x80d6, 0x080c, 0x820b, 0x0005, 0x6004, 0x9086, ++ 0x0040, 0x1120, 0x080c, 0x8026, 0x080c, 0x8125, 0x080c, 0x80d6, ++ 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x0096, 0x6114, 0x2148, 0x080c, ++ 0xb0ad, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, ++ 0x080c, 0x61a9, 0x080c, 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, ++ 0x820b, 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0138, 0xa87b, 0x0007, ++ 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0xa992, 0xa88e, 0x0005, ++ 0x9182, 0x0040, 0x0002, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, ++ 0xa851, 0xa84f, 0xa84f, 0xa8f4, 0xa84f, 0xa84f, 0xa84f, 0xa84f, ++ 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xaa22, 0x080c, ++ 0x0d84, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, ++ 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, ++ 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, ++ 0x00be, 0x86ff, 0x0904, 0xa8ed, 0x9694, 0xff00, 0x9284, 0x0c00, ++ 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, ++ 0xa8ed, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, ++ 0xb676, 0x0c38, 0x080c, 0x0fae, 0x090c, 0x0d84, 0x2900, 0xb07a, ++ 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, ++ 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, ++ 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, ++ 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, ++ 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, ++ 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, ++ 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, ++ 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, ++ 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xace6, ++ 0x003e, 0xd6cc, 0x01d0, 0x7154, 0xa98a, 0x81ff, 0x01b0, 0x9192, ++ 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, ++ 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x0038, 0xb068, 0xd0fc, ++ 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x080c, 0x178e, 0x009e, ++ 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1955, 0x2004, 0x6042, ++ 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, ++ 0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xaa1d, ++ 0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, ++ 0x11f8, 0xd1cc, 0x0904, 0xa9ec, 0xa978, 0xa868, 0xd0fc, 0x0904, ++ 0xa9ad, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, ++ 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xa97b, 0x9086, ++ 0x0028, 0x15e8, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xa983, ++ 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09d0, 0xa838, ++ 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0990, 0x6024, ++ 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, ++ 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, ++ 0xb83c, 0x8000, 0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, ++ 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, ++ 0x080c, 0x0f60, 0x009e, 0x080c, 0xb3ae, 0x0804, 0xaa1d, 0xd1dc, ++ 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xb62d, 0x0118, ++ 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, ++ 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, ++ 0x9115, 0x190c, 0xa82a, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, ++ 0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, ++ 0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, ++ 0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, ++ 0x000e, 0xa87e, 0x080c, 0xb706, 0x001e, 0xa874, 0x0006, 0x2148, ++ 0x080c, 0x0f60, 0x001e, 0x0804, 0xaa19, 0x0016, 0x00a6, 0x2150, ++ 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, ++ 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, ++ 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xb62d, 0x0118, 0xb174, ++ 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, ++ 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, ++ 0x190c, 0xa82a, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, ++ 0x00ae, 0x080c, 0x0f60, 0x009e, 0x080c, 0xb706, 0xa974, 0x0016, ++ 0x080c, 0xacd6, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, ++ 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, ++ 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xb62d, ++ 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, ++ 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, ++ 0xa938, 0x9115, 0x190c, 0xa82a, 0xa974, 0x0016, 0x080c, 0x5fda, ++ 0x001e, 0xd1e4, 0x1120, 0x080c, 0x9554, 0x009e, 0x0005, 0x080c, ++ 0xb37e, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, ++ 0x179c, 0x009e, 0x0005, 0x080c, 0x8026, 0x0010, 0x080c, 0x80d6, ++ 0x080c, 0xb0ad, 0x01c0, 0x0096, 0x6114, 0x2148, 0xa867, 0x0103, ++ 0x2009, 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, ++ 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xcc6b, 0xa877, 0x0000, ++ 0x080c, 0x61a9, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0804, ++ 0x820b, 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, ++ 0x0040, 0x0002, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa70, ++ 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, ++ 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0x080c, 0x0d84, ++ 0x080c, 0x4df2, 0x01f8, 0x6014, 0x7144, 0x918c, 0x0fff, 0x9016, ++ 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, 0x904d, 0x0188, ++ 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, 0xa867, 0x0103, ++ 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, 0xaa9e, 0x080c, ++ 0x61a9, 0x009e, 0x0804, 0x9554, 0x9182, 0x0085, 0x0002, 0xaaa6, ++ 0xaaa4, 0xaaa4, 0xaab2, 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, ++ 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, 0x080c, 0x0d84, 0x6003, 0x0001, ++ 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, ++ 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260, ++ 0x7224, 0x6216, 0x7220, 0x080c, 0xb09b, 0x01a0, 0x2268, 0x6800, ++ 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158, 0x00c6, ++ 0x2d60, 0x080c, 0xad11, 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007, ++ 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x080c, 0x7bcb, ++ 0x080c, 0x8125, 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800, 0x00be, ++ 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260, 0x080c, ++ 0xb3ae, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, ++ 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d84, 0x908a, ++ 0x0092, 0x1a0c, 0x0d84, 0x9082, 0x0085, 0x006a, 0x9186, 0x0027, ++ 0x0120, 0x9186, 0x0014, 0x190c, 0x0d84, 0x080c, 0x8026, 0x080c, ++ 0x9584, 0x0804, 0x8125, 0xab18, 0xab1a, 0xab1a, 0xab18, 0xab18, ++ 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, ++ 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, ++ 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, ++ 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8026, 0x080c, 0x2d1a, ++ 0x080c, 0xb76c, 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0150, ++ 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x61a9, ++ 0x080c, 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, ++ 0x080c, 0x95e9, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x8026, ++ 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0d60, 0xa867, 0x0103, ++ 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x08f0, ++ 0x0002, 0xab70, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab88, ++ 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0x080c, 0x0d84, ++ 0x080c, 0x8026, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, ++ 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1953, 0x0010, 0x2001, ++ 0x1954, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x8125, 0x0005, ++ 0x080c, 0x8026, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, ++ 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1953, 0x0010, 0x2001, ++ 0x1954, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x8125, 0x0005, ++ 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, ++ 0x95e9, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb8, 0xac05, 0xabb6, ++ 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0x080c, 0x0d84, ++ 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, ++ 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, ++ 0x0035, 0x1118, 0x009e, 0x0804, 0xac19, 0x080c, 0xb0ad, 0x1118, ++ 0x080c, 0xb278, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, 0x1110, ++ 0x080c, 0xb278, 0xa867, 0x0103, 0x080c, 0xb739, 0x080c, 0x61a9, ++ 0x00d6, 0x2c68, 0x080c, 0x94fe, 0x01d0, 0x6003, 0x0001, 0x6007, ++ 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, ++ 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xb4e6, 0x6954, ++ 0x6156, 0x6023, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, ++ 0x00de, 0x080c, 0x9554, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, ++ 0xb800, 0x00be, 0xd0bc, 0x0598, 0x6034, 0x908c, 0xff00, 0x810f, ++ 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, ++ 0x1530, 0x00d6, 0x2c68, 0x080c, 0xb6d9, 0x1904, 0xac5e, 0x080c, ++ 0x94fe, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, ++ 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, ++ 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, ++ 0xb4e6, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, 0x00f8, 0x0096, ++ 0x6014, 0x2048, 0x080c, 0xb0ad, 0x01c8, 0xa867, 0x0103, 0xa880, ++ 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, ++ 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xb37a, ++ 0xa877, 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x009e, 0x0804, ++ 0x9554, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0140, ++ 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x61a9, ++ 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, ++ 0x9186, 0x0027, 0x0118, 0x080c, 0x95e9, 0x0030, 0x080c, 0x8026, ++ 0x080c, 0x9584, 0x080c, 0x8125, 0x0005, 0x0056, 0x0066, 0x0096, ++ 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, ++ 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, ++ 0x0029, 0x080c, 0xace6, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, ++ 0x080c, 0x0f60, 0x080c, 0x0fae, 0x0520, 0x8528, 0xa867, 0x0110, ++ 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608, ++ 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c, ++ 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003, ++ 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000, ++ 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, ++ 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff, ++ 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x61a9, ++ 0x2a48, 0x0cb8, 0x080c, 0x61a9, 0x00ae, 0x0005, 0x00f6, 0x2079, ++ 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108, ++ 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0, ++ 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386, ++ 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000, ++ 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 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, 0xad4c, 0xad4c, 0xad47, 0xad6e, 0xad3a, ++ 0xad47, 0xad6e, 0xad47, 0xad3a, 0xad3a, 0xad47, 0xad47, 0xad47, ++ 0xad3a, 0xad3a, 0x080c, 0x0d84, 0x0036, 0x2019, 0x0010, 0x080c, ++ 0xc58e, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006, ++ 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11d8, 0x6014, ++ 0x2048, 0x080c, 0xb0ad, 0x01c0, 0xa864, 0x9086, 0x0139, 0x1128, ++ 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, ++ 0x080c, 0x63d1, 0x080c, 0xb37a, 0x080c, 0x61a9, 0x080c, 0x9584, ++ 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a, ++ 0x0016, 0x1a0c, 0x0d84, 0x0002, 0xad84, 0xada9, 0xad86, 0xadc7, ++ 0xada4, 0xad84, 0xad47, 0xad4c, 0xad4c, 0xad47, 0xad47, 0xad47, ++ 0xad47, 0xad47, 0xad47, 0xad47, 0x080c, 0x0d84, 0x86ff, 0x11c8, ++ 0x6020, 0x9086, 0x0006, 0x01a8, 0x0096, 0x6014, 0x2048, 0x080c, ++ 0xb0ad, 0x0110, 0x080c, 0xb37a, 0x009e, 0x080c, 0xb71b, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x17b0, 0x006e, ++ 0x08e8, 0x00e6, 0x2071, 0x19b4, 0x7024, 0x9c06, 0x1110, 0x080c, ++ 0x8d59, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, ++ 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x8ef6, 0x009e, 0x008e, ++ 0x0010, 0x080c, 0x8c6a, 0x00ee, 0x1908, 0x0804, 0xad47, 0x0036, ++ 0x00e6, 0x2071, 0x19b4, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, ++ 0x8dfe, 0x00ee, 0x003e, 0x0804, 0xad86, 0x080c, 0x901f, 0x00ee, ++ 0x003e, 0x1904, 0xad86, 0x0804, 0xad47, 0x00c6, 0x6020, 0x9084, ++ 0x000f, 0x0013, 0x00ce, 0x0005, 0xadfa, 0xaea2, 0xaff8, 0xae04, ++ 0x9584, 0xadfa, 0xc580, 0xb779, 0xaea2, 0xadf3, 0xb077, 0xadf3, ++ 0xadf3, 0xadf3, 0xadf3, 0x080c, 0x0d84, 0x080c, 0xb295, 0x1110, ++ 0x080c, 0x9e99, 0x0005, 0x080c, 0x8026, 0x080c, 0x8125, 0x0804, ++ 0x9554, 0x601b, 0x0001, 0x0005, 0x080c, 0xb0ad, 0x0130, 0x6014, ++ 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, ++ 0x1a0c, 0x0d84, 0x0002, 0xae23, 0xae25, 0xae49, 0xae5d, 0xae81, ++ 0xae23, 0xadfa, 0xadfa, 0xadfa, 0xae5d, 0xae5d, 0xae23, 0xae23, ++ 0xae23, 0xae23, 0xae67, 0x080c, 0x0d84, 0x00e6, 0x6014, 0x0096, ++ 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b4, 0x7024, ++ 0x9c06, 0x01a0, 0x080c, 0x8c6a, 0x080c, 0xb71b, 0x6007, 0x0085, ++ 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1954, 0x2004, 0x601a, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x0005, 0x601b, 0x0001, ++ 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, ++ 0x080c, 0xb71b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0005, 0x0096, 0x601b, 0x0001, ++ 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, ++ 0x4df2, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, ++ 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, ++ 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x61a9, 0x009e, 0x0804, ++ 0x9554, 0x6014, 0x0096, 0x904d, 0x01c0, 0xa97c, 0xd1e4, 0x01a8, ++ 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, ++ 0x0037, 0x2c08, 0x080c, 0x1492, 0x6000, 0x9086, 0x0004, 0x1120, ++ 0x2009, 0x0048, 0x080c, 0x95ce, 0x0005, 0x009e, 0x080c, 0x17b0, ++ 0x0804, 0xae49, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x000b, ++ 0x0005, 0xaeb9, 0xae01, 0xaebb, 0xaeb9, 0xaebb, 0xaebb, 0xadfb, ++ 0xaeb9, 0xadf5, 0xadf5, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeb9, ++ 0xaeb9, 0x080c, 0x0d84, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, ++ 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d84, 0x00b6, 0x0013, ++ 0x00be, 0x0005, 0xaed6, 0xaf92, 0xaed8, 0xaf13, 0xaed8, 0xaf13, ++ 0xaed8, 0xaee6, 0xaed6, 0xaf13, 0xaed6, 0xaf02, 0x080c, 0x0d84, ++ 0x6004, 0x908e, 0x0016, 0x0598, 0x908e, 0x0004, 0x0580, 0x908e, ++ 0x0002, 0x0568, 0x908e, 0x0052, 0x0904, 0xaf8e, 0x6004, 0x080c, ++ 0xb295, 0x0904, 0xafab, 0x908e, 0x0021, 0x0904, 0xafaf, 0x908e, ++ 0x0022, 0x0904, 0xaff3, 0x908e, 0x003d, 0x0904, 0xafaf, 0x908e, ++ 0x0039, 0x0904, 0xafb3, 0x908e, 0x0035, 0x0904, 0xafb3, 0x908e, ++ 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, ++ 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x2d1a, 0x080c, ++ 0x9e99, 0x0804, 0x9584, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, ++ 0x0904, 0xaf7f, 0x9186, 0x0002, 0x15b8, 0x2001, 0x1836, 0x2004, ++ 0xd08c, 0x1178, 0x080c, 0x6877, 0x1160, 0x2001, 0x194c, 0x2003, ++ 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x67be, 0x0804, ++ 0xafdc, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904, ++ 0xafdc, 0xb8a0, 0xd0bc, 0x1904, 0xafdc, 0xb840, 0x9084, 0x00ff, ++ 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, ++ 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x94fe, 0x0128, 0x2b00, ++ 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, ++ 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, ++ 0x2009, 0x1836, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, ++ 0x080c, 0x5677, 0x00ee, 0x080c, 0x9e99, 0x0030, 0x080c, 0x9e99, ++ 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x00e6, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x2d3f, 0x012e, 0x00ee, 0x080c, 0x9584, 0x0005, 0x2001, ++ 0x0002, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2d3f, ++ 0x0804, 0xaf0f, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, ++ 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xaf54, ++ 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, ++ 0x00de, 0x00ce, 0x0898, 0x080c, 0x9e99, 0x0804, 0xaf11, 0x080c, ++ 0x9ed5, 0x0804, 0xaf11, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xb6d9, ++ 0x00de, 0x0118, 0x080c, 0x9554, 0x00f0, 0x6004, 0x8007, 0x6134, ++ 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, ++ 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1954, 0x2004, 0x601a, ++ 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x0005, 0x00de, 0x00ce, 0x080c, 0x9e99, ++ 0x080c, 0x2d1a, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2d3f, ++ 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, ++ 0x012e, 0x00ee, 0x0005, 0x080c, 0x994c, 0x1904, 0xafab, 0x0005, ++ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x0096, 0x00d6, 0x001b, ++ 0x00de, 0x009e, 0x0005, 0xb013, 0xb013, 0xb013, 0xb013, 0xb013, ++ 0xb013, 0xb013, 0xb013, 0xb013, 0xadfa, 0xb013, 0xae01, 0xb015, ++ 0xae01, 0xb022, 0xb013, 0x080c, 0x0d84, 0x6004, 0x9086, 0x008b, ++ 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x0005, 0x080c, 0xb74d, 0x0118, 0x080c, 0xb75e, 0x0010, ++ 0x080c, 0xb76c, 0x080c, 0xb278, 0x080c, 0xb0ad, 0x0570, 0x080c, ++ 0x2d1a, 0x080c, 0xb0ad, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, ++ 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, ++ 0x61a9, 0x2c68, 0x080c, 0x94fe, 0x0150, 0x6810, 0x6012, 0x080c, ++ 0xb4e6, 0x00c6, 0x2d60, 0x080c, 0x9584, 0x00ce, 0x0008, 0x2d60, ++ 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, ++ 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00c8, 0x080c, 0xb74d, 0x0138, ++ 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x2d1a, 0x08d0, 0x6034, ++ 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, ++ 0x1118, 0x080c, 0x2d1a, 0x0868, 0x080c, 0x9584, 0x0005, 0x6000, ++ 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x0002, 0xb08d, 0xb08d, 0xb08f, ++ 0xb08f, 0xb08f, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, ++ 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0x080c, 0x0d84, 0x080c, ++ 0x901f, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x61a9, ++ 0x009e, 0x0804, 0x9554, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, ++ 0x0240, 0x2001, 0x1818, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, ++ 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0018, 0x0096, 0x6014, 0x2048, ++ 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1057, 0x009e, ++ 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2061, 0x1cd0, 0x2071, 0x1800, 0x734c, 0x706c, 0x9302, 0x12a8, ++ 0x6020, 0x9206, 0x1160, 0x080c, 0xb460, 0x0148, 0x080c, 0xb295, ++ 0x1110, 0x080c, 0x9e99, 0x00c6, 0x080c, 0x9554, 0x00ce, 0x9ce0, ++ 0x0018, 0x7060, 0x9c02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, ++ 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, ++ 0x210c, 0x81ff, 0x0128, 0x2061, 0x1a72, 0x6112, 0x080c, 0x2d1a, ++ 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, ++ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x01d8, 0x080c, ++ 0x4df2, 0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, ++ 0x4df2, 0x0118, 0x080c, 0xb1bc, 0x0168, 0x080c, 0xb4e6, 0x6023, ++ 0x0003, 0x2009, 0x004b, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, ++ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, ++ 0xbaa0, 0x080c, 0x95a1, 0x0590, 0x080c, 0x4df2, 0x0118, 0x602f, ++ 0x0000, 0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xb4e6, ++ 0x6023, 0x0003, 0x0016, 0x080c, 0x7d55, 0x0076, 0x903e, 0x080c, ++ 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x001e, 0xd184, 0x0128, ++ 0x080c, 0x9554, 0x9085, 0x0001, 0x0070, 0x080c, 0x4df2, 0x0128, ++ 0xd18c, 0x1170, 0x080c, 0xb1bc, 0x0148, 0x2009, 0x004c, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, ++ 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, ++ 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0x94fe, 0x2c78, 0x01d8, ++ 0x080c, 0x4df2, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, ++ 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xb1ce, 0x2f60, 0x080c, ++ 0x4df2, 0x0118, 0x080c, 0xb1bc, 0x0130, 0x001e, 0x0016, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, ++ 0x00f6, 0x00c6, 0x0046, 0x080c, 0x94fe, 0x2c78, 0x0530, 0x080c, ++ 0x4df2, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, ++ 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x194d, ++ 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9554, 0x0060, 0x2f60, ++ 0x080c, 0x4df2, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, ++ 0x0052, 0x080c, 0x95ce, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, ++ 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x441f, 0x00ce, ++ 0x1120, 0x080c, 0x9554, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, ++ 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x5d41, 0x0158, 0x2001, 0xb1d3, ++ 0x0006, 0x900e, 0x2400, 0x080c, 0x63d1, 0x080c, 0x61a9, 0x000e, ++ 0x0807, 0x2418, 0x080c, 0x7fc0, 0xbaa0, 0x0086, 0x2041, 0x0001, ++ 0x2039, 0x0001, 0x2608, 0x080c, 0x7d6d, 0x008e, 0x080c, 0x7c4d, ++ 0x2f08, 0x2648, 0x080c, 0xc73e, 0xb93c, 0x81ff, 0x090c, 0x7e2b, ++ 0x080c, 0x8125, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x94fe, 0x0190, 0x660a, 0x2b08, 0x6112, ++ 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, ++ 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, ++ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x95a1, 0x01b8, ++ 0x660a, 0x2b08, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0008, 0x2900, ++ 0x6016, 0x00f6, 0x2c78, 0x080c, 0x150d, 0x00fe, 0x2009, 0x0021, ++ 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, ++ 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, ++ 0x080c, 0x94fe, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xb4e6, ++ 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0x95ce, ++ 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, ++ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x95a1, 0x0188, 0x2b08, ++ 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, ++ 0x0000, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, ++ 0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, ++ 0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, ++ 0xba3e, 0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, ++ 0x0002, 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, ++ 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6014, ++ 0x904d, 0x0148, 0xa864, 0x9086, 0x0139, 0x0138, 0xa868, 0xd0fc, ++ 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, ++ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x0198, 0x2b08, ++ 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, ++ 0x2d1a, 0x2009, 0x0028, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, ++ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, ++ 0x1822, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa0c5, ++ 0x00be, 0x080c, 0xa2bc, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, ++ 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xb69a, 0x080c, ++ 0x9e99, 0x080c, 0x9554, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, ++ 0x0d84, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, ++ 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, ++ 0x012e, 0x009e, 0x080c, 0x9554, 0x0c30, 0x0096, 0x9186, 0x0016, ++ 0x1128, 0x2001, 0x0004, 0x080c, 0x5b61, 0x00e8, 0x9186, 0x0015, ++ 0x1510, 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, ++ 0x00b6, 0x2058, 0x080c, 0x5ca8, 0x00be, 0x080c, 0xa38d, 0x1198, ++ 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, ++ 0x0006, 0x080c, 0x5b61, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, ++ 0x080c, 0x9920, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, ++ 0x080c, 0x9e99, 0x080c, 0x9554, 0x009e, 0x0005, 0x6014, 0x6310, ++ 0x2358, 0x904d, 0x090c, 0x0d84, 0xa87b, 0x0000, 0xa883, 0x0000, ++ 0xa897, 0x4000, 0x900e, 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, ++ 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x61a9, 0x012e, 0x080c, 0x9554, 0x08f8, 0x6014, 0x904d, 0x090c, ++ 0x0d84, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, ++ 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, ++ 0x012e, 0x080c, 0x9554, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, ++ 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, ++ 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x7bcb, ++ 0x080c, 0x8125, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, ++ 0x0005, 0xadfa, 0xb3aa, 0xb3aa, 0xb3ad, 0xca0f, 0xca2a, 0xca2d, ++ 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, ++ 0x080c, 0x0d84, 0xa001, 0xa001, 0x0005, 0x0000, 0x6010, 0x00b6, ++ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x00f6, 0x2c78, 0x080c, ++ 0x94fe, 0x1128, 0x2001, 0x1955, 0x2004, 0x7842, 0x00f8, 0x7810, ++ 0x6012, 0x080c, 0xb4e6, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808, ++ 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a, ++ 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7954, ++ 0x6156, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2f60, 0x00fe, 0x0005, ++ 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0170, 0xc0e4, ++ 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, ++ 0x0120, 0xa878, 0x2048, 0x080c, 0x0f60, 0x6830, 0x6036, 0x908e, ++ 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0168, 0x9006, ++ 0x602e, 0x6032, 0x00c8, 0x681c, 0xc085, 0x681e, 0x6803, 0x0004, ++ 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, ++ 0x9102, 0xa8b0, 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, 0x7bcb, 0x080c, 0x8125, 0x009e, 0x001e, ++ 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, ++ 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, ++ 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, ++ 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, ++ 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, ++ 0xa83c, 0x603a, 0xa840, 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, 0x194f, 0x200c, ++ 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x7a4b, 0x2001, 0x1953, ++ 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1951, 0x200c, ++ 0x8000, 0x2014, 0x2071, 0x193b, 0x711a, 0x721e, 0x2001, 0x0064, ++ 0x080c, 0x7a4b, 0x2001, 0x1954, 0x82ff, 0x1110, 0x2011, 0x0014, ++ 0x2202, 0x2001, 0x1955, 0x9288, 0x000a, 0x2102, 0x2001, 0x1a54, ++ 0x2102, 0x2001, 0x0032, 0x080c, 0x1492, 0x080c, 0x5f0e, 0x00ee, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, ++ 0x2001, 0x1953, 0x2003, 0x0028, 0x2001, 0x1954, 0x2003, 0x0014, ++ 0x2071, 0x193b, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1955, ++ 0x2009, 0x001e, 0x2102, 0x2001, 0x1a54, 0x2102, 0x2001, 0x0032, ++ 0x080c, 0x1492, 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6058, ++ 0x904d, 0x0110, 0x080c, 0x0fe0, 0x009e, 0x0005, 0x0005, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x0180, 0x2b08, 0x6112, ++ 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, ++ 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, ++ 0x7088, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, ++ 0x1160, 0x2c78, 0x080c, 0x8315, 0x01d8, 0x7074, 0xaa50, 0x9206, ++ 0x1160, 0x7078, 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, ++ 0xbaa0, 0x00be, 0x900e, 0x080c, 0x2d5f, 0x080c, 0x9920, 0x0020, ++ 0x080c, 0x9e99, 0x080c, 0x9554, 0x00fe, 0x00ee, 0x009e, 0x0005, ++ 0x7058, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x94fe, 0x0188, 0x2b08, 0x6112, 0x080c, 0xb4e6, ++ 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0x95ce, ++ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x94fe, 0x0180, 0x2b08, ++ 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, ++ 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, ++ 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, ++ 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, ++ 0x7188, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, ++ 0x0000, 0x2001, 0x196d, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, ++ 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, ++ 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, 0x200c, ++ 0x080c, 0xbcf8, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, ++ 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, 0x9e99, 0x080c, ++ 0x9554, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, ++ 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, ++ 0x9186, 0x0015, 0x11b8, 0x7088, 0x9086, 0x0004, 0x1198, 0x6014, ++ 0x2048, 0x2c78, 0x080c, 0x8315, 0x01a8, 0x7074, 0xaa74, 0x9206, ++ 0x1130, 0x7078, 0xaa78, 0x9206, 0x1110, 0x080c, 0x2d1a, 0x080c, ++ 0x9920, 0x0020, 0x080c, 0x9e99, 0x080c, 0x9554, 0x00fe, 0x00ee, ++ 0x009e, 0x0005, 0x7058, 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, ++ 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1538, 0x7088, ++ 0x9086, 0x0004, 0x1518, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8315, ++ 0x05b8, 0x7074, 0xaacc, 0x9206, 0x1180, 0x7078, 0xaad0, 0x9206, ++ 0x1160, 0x080c, 0x2d1a, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, ++ 0xc0fd, 0x080c, 0x4da2, 0x001e, 0x0010, 0x080c, 0x4b95, 0xa87b, ++ 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0060, 0x080c, 0x4b95, ++ 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, ++ 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, ++ 0x61a9, 0x012e, 0x080c, 0x9554, 0x00fe, 0x00ee, 0x009e, 0x0005, ++ 0x7058, 0xaad0, 0x9206, 0x0968, 0x08c0, 0x0016, 0x0026, 0xa87c, ++ 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, 0xa890, ++ 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, 0x9085, ++ 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, 0x0096, ++ 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, ++ 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, ++ 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, ++ 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, ++ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, ++ 0x0f2b, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, ++ 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, 0x00ce, 0x0090, 0xaa96, ++ 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, ++ 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, ++ 0xa89e, 0x080c, 0x619c, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, ++ 0x00be, 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, ++ 0x6214, 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, ++ 0x11a0, 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x23fd, 0x2118, ++ 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, ++ 0x2011, 0x8018, 0x080c, 0x447f, 0x00a8, 0x9096, 0x0001, 0x1148, ++ 0x89ff, 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, ++ 0x0048, 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, ++ 0x783c, 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, ++ 0x0005, 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, ++ 0x0008, 0x6a2c, 0x080c, 0xb09b, 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, 0xa974, 0xd1cc, ++ 0x0188, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, ++ 0x0f00, 0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, ++ 0x190c, 0xa82a, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, ++ 0x901e, 0x0459, 0x01a0, 0x080c, 0xb0ad, 0x0188, 0x6037, 0x4000, ++ 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0xa867, 0x0103, ++ 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x61a9, 0x009e, 0x003e, ++ 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, ++ 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, ++ 0x080c, 0xb37a, 0xa877, 0x0000, 0x0005, 0x2001, 0x180f, 0x2004, ++ 0xd0ec, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0f4, 0x000e, ++ 0x0005, 0x2001, 0x180f, 0x2004, 0xd0e4, 0x0005, 0x0036, 0x0046, ++ 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, ++ 0x44f9, 0x004e, 0x003e, 0x0005, 0x0c61, 0x1d81, 0x0005, 0x2001, ++ 0x1953, 0x2004, 0x601a, 0x0005, 0x2001, 0x1955, 0x2004, 0x6042, ++ 0x0005, 0x080c, 0x9554, 0x0804, 0x8125, 0x00b6, 0x0066, 0x6000, ++ 0x90b2, 0x0016, 0x1a0c, 0x0d84, 0x001b, 0x006e, 0x00be, 0x0005, ++ 0xb798, 0xbdf9, 0xbf54, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, ++ 0xb7cf, 0xbfcf, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, ++ 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d84, ++ 0x0013, 0x006e, 0x0005, 0xb7b3, 0xc519, 0xb7b3, 0xb7b3, 0xb7b3, ++ 0xb7b3, 0xb7b3, 0xb7b3, 0xc4c8, 0xc56d, 0xb7b3, 0xcb4c, 0xcb82, ++ 0xcb4c, 0xcb82, 0xb7b3, 0x080c, 0x0d84, 0x6000, 0x9082, 0x0016, ++ 0x1a0c, 0x0d84, 0x6000, 0x000a, 0x0005, 0xb7cd, 0xc1ad, 0xc29d, ++ 0xc2bf, 0xc366, 0xb7cd, 0xc43f, 0xc3ee, 0xbfdb, 0xc49e, 0xc4b3, ++ 0xb7cd, 0xb7cd, 0xb7cd, 0xb7cd, 0xb7cd, 0x080c, 0x0d84, 0x91b2, ++ 0x0053, 0x1a0c, 0x0d84, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xbbfa, ++ 0x0002, 0xb819, 0xb9eb, 0xb819, 0xb819, 0xb819, 0xb9f4, 0xb819, ++ 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, ++ 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, ++ 0xb81b, 0xb871, 0xb880, 0xb8e1, 0xb908, 0xb97f, 0xb9d6, 0xb819, ++ 0xb819, 0xb9f7, 0xb819, 0xb819, 0xba0c, 0xba19, 0xb819, 0xb819, ++ 0xb819, 0xb819, 0xb819, 0xba9c, 0xb819, 0xb819, 0xbab0, 0xb819, ++ 0xb819, 0xba6b, 0xb819, 0xb819, 0xb819, 0xbac8, 0xb819, 0xb819, ++ 0xb819, 0xbb45, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, ++ 0xbbc2, 0x080c, 0x0d84, 0x080c, 0x5eeb, 0x1150, 0x2001, 0x1836, ++ 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, ++ 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xb9e4, ++ 0x080c, 0x5ed5, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, ++ 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, ++ 0x903e, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x001e, ++ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, ++ 0x5c1c, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, ++ 0xc675, 0x1904, 0xb8db, 0x080c, 0xc611, 0x1120, 0x6007, 0x0008, ++ 0x0804, 0xb9e4, 0x6007, 0x0009, 0x0804, 0xb9e4, 0x080c, 0xc860, ++ 0x0128, 0x080c, 0xc675, 0x0d78, 0x0804, 0xb8db, 0x6017, 0x1900, ++ 0x0c88, 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x6106, 0x080c, 0xc5c8, ++ 0x6007, 0x0006, 0x0804, 0xb9e4, 0x6007, 0x0007, 0x0804, 0xb9e4, ++ 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, ++ 0x1220, 0x2001, 0x0001, 0x080c, 0x5b4d, 0x96b4, 0xff00, 0x8637, ++ 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, ++ 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, ++ 0x0005, 0x0110, 0x00de, 0x0478, 0x00e6, 0x2071, 0x0260, 0x7034, ++ 0x90b4, 0x0003, 0x1138, 0x90b2, 0x0014, 0x0220, 0x7030, 0x9084, ++ 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, ++ 0x00ee, 0x080c, 0xc6d4, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, ++ 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x2d5f, 0x002e, 0x080c, ++ 0x5ca8, 0x6007, 0x000a, 0x00de, 0x0804, 0xb9e4, 0x6007, 0x000b, ++ 0x00de, 0x0804, 0xb9e4, 0x080c, 0x2d1a, 0x6007, 0x0001, 0x0804, ++ 0xb9e4, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, ++ 0xbbf7, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1958, 0x90b2, ++ 0x0014, 0x0a40, 0x7030, 0x9084, 0x0003, 0x1920, 0x6610, 0x2658, ++ 0xbe04, 0x9686, 0x0707, 0x09f8, 0x0026, 0x6210, 0x2258, 0xbaa0, ++ 0x900e, 0x080c, 0x2d5f, 0x002e, 0x6007, 0x000c, 0x0804, 0xb9e4, ++ 0x080c, 0x5eeb, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, ++ 0x9086, 0x0008, 0x1110, 0x0804, 0xb828, 0x080c, 0x5ed5, 0x6610, ++ 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06b8, 0x1138, ++ 0x0026, 0x2001, 0x0006, 0x080c, 0x5b8d, 0x002e, 0x0050, 0x96b4, ++ 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, ++ 0xb8db, 0x080c, 0xc6e1, 0x1120, 0x6007, 0x000e, 0x0804, 0xb9e4, ++ 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2d1a, 0x004e, ++ 0x0016, 0x9006, 0x2009, 0x1853, 0x210c, 0xd1a4, 0x0148, 0x2009, ++ 0x0029, 0x080c, 0xc9c5, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, ++ 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xb9e4, 0x2001, 0x0001, ++ 0x080c, 0x5b4d, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, ++ 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xa425, 0x003e, 0x002e, ++ 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, ++ 0x0004, 0x0a04, 0xb8db, 0x9682, 0x0007, 0x0a04, 0xb931, 0x0804, ++ 0xb8db, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xb9e4, 0x080c, ++ 0x5eeb, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, ++ 0x0008, 0x1110, 0x0804, 0xb828, 0x080c, 0x5ed5, 0x6610, 0x2658, ++ 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0680, 0x96b4, 0xff00, ++ 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xb8db, ++ 0x080c, 0xc70f, 0x1130, 0x080c, 0xc611, 0x1118, 0x6007, 0x0010, ++ 0x04d8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2d1a, ++ 0x004e, 0x0016, 0x9006, 0x2009, 0x1853, 0x210c, 0xd1a4, 0x0148, ++ 0x2009, 0x0029, 0x080c, 0xc9c5, 0x6010, 0x2058, 0xb800, 0xc0e5, ++ 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc860, ++ 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0988, 0x0804, ++ 0xb8db, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2e39, ++ 0x1904, 0xbbf7, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0xbd93, ++ 0x1904, 0xb8db, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x7c1d, ++ 0x080c, 0x8125, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, ++ 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x080c, ++ 0xbd93, 0x1904, 0xb8db, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0005, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, ++ 0x0005, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, ++ 0xbbf7, 0x080c, 0xbd93, 0x1904, 0xb8db, 0x0016, 0x0026, 0x00e6, ++ 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, ++ 0xb09b, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, ++ 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, ++ 0x9006, 0x080c, 0xc997, 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, 0x9554, 0x2160, 0x6007, ++ 0x0025, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00ee, ++ 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5b4d, 0x0156, ++ 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, ++ 0x0276, 0x080c, 0xa425, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, ++ 0x6007, 0x0031, 0x0804, 0xb9e4, 0x080c, 0xa0dc, 0x080c, 0x6877, ++ 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6891, 0x1138, 0x080c, ++ 0x6b40, 0x080c, 0x56d9, 0x080c, 0x67be, 0x0010, 0x080c, 0x6853, ++ 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x080c, 0xbd93, 0x1904, 0xb8db, 0x6106, 0x080c, 0xbdaf, 0x1120, ++ 0x6007, 0x002b, 0x0804, 0xb9e4, 0x6007, 0x002c, 0x0804, 0xb9e4, ++ 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x080c, 0xbd93, 0x1904, 0xb8db, 0x6106, 0x080c, 0xbdb3, 0x1120, ++ 0x6007, 0x002e, 0x0804, 0xb9e4, 0x6007, 0x002f, 0x0804, 0xb9e4, ++ 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x00e6, 0x00d6, 0x00c6, 0x6010, ++ 0x2058, 0xb804, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, ++ 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, ++ 0x0804, 0xb9eb, 0x080c, 0x4dee, 0xd0e4, 0x0904, 0xbb42, 0x2071, ++ 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, ++ 0x5f29, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, ++ 0x9206, 0x0510, 0x080c, 0x5f25, 0x15b8, 0x2069, 0x1800, 0x6878, ++ 0x9206, 0x1590, 0x6874, 0x9106, 0x1578, 0x7210, 0x080c, 0xb09b, ++ 0x0590, 0x080c, 0xbc80, 0x0578, 0x080c, 0xca3c, 0x0560, 0x622e, ++ 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, ++ 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, ++ 0x080c, 0xb09b, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, ++ 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xc997, ++ 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, ++ 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, ++ 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x2e39, 0x1904, ++ 0xbbf7, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, ++ 0x0006, 0x1904, 0xb9eb, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x4dee, ++ 0xd0e4, 0x0904, 0xbbba, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, ++ 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, ++ 0x2c08, 0x9085, 0x0001, 0x080c, 0xc997, 0x2c10, 0x00ce, 0x05e8, ++ 0x080c, 0xb09b, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, ++ 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xad11, 0x002e, 0x00ce, ++ 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, ++ 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, ++ 0x9005, 0x0170, 0x080c, 0xbc80, 0x0904, 0xbb3b, 0x0056, 0x7510, ++ 0x7614, 0x080c, 0xca55, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, ++ 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0c78, 0x6007, 0x003b, 0x602f, ++ 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, ++ 0x0804, 0xbb12, 0x00e6, 0x0026, 0x080c, 0x5eeb, 0x0550, 0x080c, ++ 0x5ed5, 0x080c, 0xcc30, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085, ++ 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72a8, 0x9284, 0x00ff, ++ 0x7076, 0x78e6, 0x9284, 0xff00, 0x7278, 0x9205, 0x707a, 0x78ea, ++ 0x00fe, 0x70e3, 0x0000, 0x080c, 0x5f29, 0x0120, 0x2011, 0x19cd, ++ 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2b1e, 0x0010, 0x080c, ++ 0xcc62, 0x002e, 0x00ee, 0x080c, 0x9554, 0x0804, 0xb9ea, 0x080c, ++ 0x9554, 0x0005, 0x2600, 0x0002, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, ++ 0xbc0e, 0xbc10, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc2b, 0xbc0e, ++ 0xbc0e, 0xbc0e, 0xbc3d, 0xbc4a, 0xbc7b, 0xbc0e, 0x080c, 0x0d84, ++ 0x080c, 0xcbbe, 0x1d20, 0x080c, 0x2e39, 0x1d08, 0x080c, 0xbd93, ++ 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x0005, 0x080c, 0x2d1a, 0x6007, 0x0001, 0x6003, 0x0001, ++ 0x080c, 0x7c1d, 0x0005, 0x080c, 0xcbbe, 0x1948, 0x080c, 0x2e39, ++ 0x1930, 0x080c, 0xbd93, 0x1d70, 0x703c, 0x6016, 0x6007, 0x004a, ++ 0x6003, 0x0001, 0x080c, 0x7c1d, 0x0005, 0x080c, 0xbc9b, 0x0904, ++ 0xbbf7, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, ++ 0x8125, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, ++ 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, ++ 0x198a, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x198b, 0x2004, ++ 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, ++ 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa439, ++ 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x7c1d, ++ 0x080c, 0x8125, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, ++ 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058, ++ 0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106, 0x1120, 0x712c, ++ 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, ++ 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, ++ 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x7088, 0x908a, ++ 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x196d, 0x2003, 0x0000, ++ 0x080c, 0x0fc7, 0x05a0, 0x2900, 0x6016, 0x7088, 0x8004, 0xa816, ++ 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, ++ 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x0fc7, 0x01c0, 0x2900, ++ 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, ++ 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, ++ 0x1800, 0x708b, 0x0000, 0x6014, 0x2048, 0x080c, 0x0f60, 0x9006, ++ 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, ++ 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, ++ 0x080c, 0x1fed, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, ++ 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, ++ 0x080c, 0x1fed, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x1fed, 0x2061, ++ 0x196d, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, ++ 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x1fed, ++ 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196d, 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, 0x2005, 0x20a1, 0x024c, 0x2001, ++ 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, ++ 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2005, 0x20a1, ++ 0x0240, 0x0c98, 0x080c, 0x2005, 0x2061, 0x1970, 0x6004, 0x20a0, ++ 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, ++ 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x2005, 0x20a1, ++ 0x0240, 0x0c98, 0x2061, 0x1970, 0x2019, 0x0260, 0x3400, 0x931e, ++ 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162, ++ 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, ++ 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04, ++ 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004, ++ 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686, ++ 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 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, 0x23fd, 0x1128, 0x2110, 0x900e, ++ 0x080c, 0x2d5f, 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, 0x0d84, 0x91b6, 0x0013, ++ 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xbf24, 0x0092, 0x91b6, ++ 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d84, 0x2001, 0x0007, ++ 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, ++ 0x0005, 0xbe59, 0xbe5b, 0xbe59, 0xbe59, 0xbe59, 0xbe5b, 0xbe6a, ++ 0xbf1d, 0xbebc, 0xbf1d, 0xbece, 0xbf1d, 0xbe6a, 0xbf1d, 0xbf15, ++ 0xbf1d, 0xbf15, 0xbf1d, 0xbf1d, 0xbe59, 0xbe59, 0xbe59, 0xbe59, ++ 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe5b, ++ 0xbe59, 0xbf1d, 0xbe59, 0xbe59, 0xbf1d, 0xbe59, 0xbf1a, 0xbf1d, ++ 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbf1d, 0xbf1d, 0xbe59, 0xbf1d, ++ 0xbf1d, 0xbe59, 0xbe65, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbf19, ++ 0xbf1d, 0xbe59, 0xbe59, 0xbf1d, 0xbf1d, 0xbe59, 0xbe59, 0xbe59, ++ 0xbe59, 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0xb76f, 0x6003, ++ 0x0002, 0x080c, 0x8125, 0x0804, 0xbf23, 0x9006, 0x080c, 0x5b4d, ++ 0x0804, 0xbf1d, 0x080c, 0x5f25, 0x1904, 0xbf1d, 0x9006, 0x080c, ++ 0x5b4d, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, ++ 0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0428, 0x6010, ++ 0x2058, 0xb8b0, 0x9005, 0x1178, 0x080c, 0xb759, 0x1904, 0xbf1d, ++ 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x44f9, 0x004e, ++ 0x003e, 0x0804, 0xbf1d, 0x080c, 0x2e64, 0x1904, 0xbf1d, 0x2001, ++ 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, ++ 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5b61, ++ 0x080c, 0x8026, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x7c1d, 0x080c, 0x8125, 0x6110, 0x2158, 0x2009, 0x0001, ++ 0x080c, 0x7826, 0x0804, 0xbf23, 0x6610, 0x2658, 0xbe04, 0x96b4, ++ 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xbf1d, 0x9686, 0x0004, ++ 0x0904, 0xbf1d, 0x2001, 0x0004, 0x0804, 0xbf1b, 0x2001, 0x1800, ++ 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, ++ 0xbba0, 0x2021, 0x0006, 0x080c, 0x44f9, 0x004e, 0x003e, 0x2001, ++ 0x0006, 0x080c, 0xbf41, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, ++ 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, ++ 0x080c, 0x5b8d, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, ++ 0x0006, 0x080c, 0x5b61, 0x080c, 0x5f25, 0x11f8, 0x2001, 0x1836, ++ 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, ++ 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe, ++ 0x0804, 0xbea4, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, ++ 0x0020, 0x0018, 0x0010, 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, ++ 0x9554, 0x080c, 0x8125, 0x0005, 0x2600, 0x0002, 0xbf38, 0xbf38, ++ 0xbf38, 0xbf38, 0xbf38, 0xbf3a, 0xbf38, 0xbf38, 0xbf38, 0xbf38, ++ 0xbf3a, 0xbf38, 0xbf38, 0xbf38, 0xbf3a, 0xbf3a, 0xbf3a, 0xbf3a, ++ 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9554, 0x080c, 0x8125, ++ 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, ++ 0x0138, 0x080c, 0x5b61, 0x9006, 0x080c, 0x5b4d, 0x080c, 0x2d3f, ++ 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, ++ 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d84, 0x91b6, 0x0015, ++ 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d84, 0x006b, ++ 0x0005, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0xbfb9, ++ 0xbf81, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, ++ 0x9f7a, 0x9f7a, 0x9f7a, 0xbfb9, 0xbfc0, 0x9f7a, 0x9f7a, 0x9f7a, ++ 0x9f7a, 0x00f6, 0x080c, 0x5f25, 0x11c0, 0x6010, 0x905d, 0x01a8, ++ 0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, ++ 0x080c, 0x5b61, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00d0, 0x2011, 0x0263, 0x2204, ++ 0x8211, 0x220c, 0x080c, 0x23fd, 0x1190, 0x080c, 0x5c0d, 0x0118, ++ 0x080c, 0x9554, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006, 0x080c, ++ 0x56f3, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x9554, 0x00fe, ++ 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9554, 0x0005, ++ 0x080c, 0xa2b9, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0010, 0x080c, 0x9554, 0x0005, 0x6004, ++ 0x908a, 0x0053, 0x1a0c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, ++ 0x080c, 0x8125, 0x0005, 0x9182, 0x0040, 0x0002, 0xbff1, 0xbff1, ++ 0xbff1, 0xbff1, 0xbff3, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, ++ 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, ++ 0xbff1, 0x080c, 0x0d84, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, ++ 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8, 0x6106, ++ 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc05a, 0x080c, ++ 0xcccc, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, ++ 0x0200, 0x080c, 0x7a0a, 0x0020, 0x9026, 0x080c, 0xcc03, 0x0c38, ++ 0x080c, 0x0fae, 0x090c, 0x0d84, 0x6003, 0x0007, 0xa867, 0x010d, ++ 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, 0xa8e2, ++ 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, 0xa87f, ++ 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x61a9, 0x001e, ++ 0x080c, 0xcccc, 0x1904, 0xc0ba, 0x9486, 0x2000, 0x1130, 0x2019, ++ 0x0017, 0x080c, 0xc941, 0x0804, 0xc0ba, 0x9486, 0x0400, 0x1130, ++ 0x2019, 0x0002, 0x080c, 0xc8f8, 0x0804, 0xc0ba, 0x9486, 0x0200, ++ 0x1110, 0x080c, 0xc8dd, 0x9486, 0x1000, 0x1110, 0x080c, 0xc926, ++ 0x0804, 0xc0ba, 0x2069, 0x1a3d, 0x6a00, 0xd284, 0x0904, 0xc124, ++ 0x9284, 0x0300, 0x1904, 0xc11d, 0x6804, 0x9005, 0x0904, 0xc105, ++ 0x2d78, 0x6003, 0x0007, 0x080c, 0x0fc7, 0x0904, 0xc0c6, 0x7800, ++ 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, ++ 0x180e, 0x2004, 0xd084, 0x1904, 0xc128, 0x9006, 0xa802, 0xa867, ++ 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058, ++ 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be, ++ 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084, ++ 0x0003, 0x9080, 0xc0c2, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001, ++ 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080, ++ 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b, ++ 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae, ++ 0x080c, 0x61a9, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, ++ 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x180f, ++ 0x2004, 0xd084, 0x0120, 0x080c, 0x0fae, 0x1904, 0xc06f, 0x6017, ++ 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, ++ 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, ++ 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0828, 0x6868, 0x602e, 0x686c, ++ 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x0804, 0xc0ba, 0x2001, 0x180d, 0x2004, ++ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x6017, 0xf300, ++ 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x0804, 0xc0ba, 0x6017, 0xf500, 0x0c98, ++ 0x6017, 0xf600, 0x0804, 0xc0da, 0x6017, 0xf200, 0x0804, 0xc0da, ++ 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, ++ 0x7044, 0x9084, 0x0003, 0x9080, 0xc0c2, 0x2005, 0xa87e, 0x2928, ++ 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e, ++ 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205, ++ 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210, ++ 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0d84, ++ 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, ++ 0x9080, 0x0029, 0x20a0, 0x2011, 0xc1a4, 0x2041, 0x0001, 0x223d, ++ 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, ++ 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, ++ 0x2098, 0x0c68, 0x2950, 0x080c, 0x0fc7, 0x0170, 0x2900, 0xb002, ++ 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, ++ 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, ++ 0x080c, 0x0fe0, 0x0cc8, 0x080c, 0x0fe0, 0x0804, 0xc0c6, 0x2548, ++ 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, ++ 0x080c, 0xc970, 0x0804, 0xc0ba, 0x8010, 0x0004, 0x801a, 0x0006, ++ 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, ++ 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0d84, 0x9082, 0x0040, 0x0a0c, ++ 0x0d84, 0x2008, 0x0804, 0xc255, 0x9186, 0x0051, 0x0108, 0x00c0, ++ 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xc206, 0x0126, 0x2091, ++ 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7ab7, 0x002e, 0x001e, ++ 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xc29d, ++ 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, ++ 0x0500, 0x190c, 0x0d84, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, ++ 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006, ++ 0x0016, 0x0026, 0x080c, 0x7ab7, 0x002e, 0x001e, 0x000e, 0x00ce, ++ 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0d84, 0x0804, ++ 0xc366, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x95e9, ++ 0x0005, 0xc21c, 0xc21e, 0xc21e, 0xc245, 0xc21c, 0xc21c, 0xc21c, ++ 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, ++ 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0x080c, 0x0d84, 0x080c, 0x8026, ++ 0x080c, 0x8125, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, ++ 0xb0ad, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xc970, 0x6017, ++ 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1954, 0x2004, 0x601a, ++ 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x8026, ++ 0x080c, 0x8125, 0x080c, 0xb0ad, 0x0120, 0x6014, 0x2048, 0x080c, ++ 0x0fe0, 0x080c, 0x9584, 0x009e, 0x0005, 0x0002, 0xc269, 0xc280, ++ 0xc26b, 0xc297, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, ++ 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, ++ 0xc269, 0x080c, 0x0d84, 0x0096, 0x080c, 0x8026, 0x6014, 0x2048, ++ 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, ++ 0x95ce, 0x0010, 0x6003, 0x0004, 0x080c, 0x8125, 0x009e, 0x0005, ++ 0x080c, 0x8026, 0x080c, 0xb0ad, 0x0138, 0x6114, 0x0096, 0x2148, ++ 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x79df, 0x080c, 0x9554, ++ 0x080c, 0x8125, 0x0005, 0x080c, 0xcbc7, 0x0db0, 0x0cc8, 0x080c, ++ 0x8026, 0x2009, 0x0041, 0x0804, 0xc3ee, 0x9182, 0x0040, 0x0002, ++ 0xc2b3, 0xc2b5, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, ++ 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, ++ 0xc2b3, 0xc2b6, 0xc2b3, 0x080c, 0x0d84, 0x0005, 0x00d6, 0x080c, ++ 0x79df, 0x00de, 0x080c, 0xcc1f, 0x080c, 0x9554, 0x0005, 0x9182, ++ 0x0040, 0x0002, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, ++ 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d7, 0xc32e, 0xc2d5, 0xc2d5, 0xc2d5, ++ 0xc2d5, 0xc32e, 0xc2d5, 0xc2d5, 0xc2d5, 0x080c, 0x0d84, 0x2001, ++ 0x0105, 0x2004, 0x9084, 0x1800, 0x1904, 0xc32e, 0x2001, 0x1872, ++ 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x80d6, 0x6014, ++ 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, ++ 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, ++ 0x8202, 0x2009, 0x0041, 0x009e, 0x0804, 0xc3ee, 0x080c, 0x8202, ++ 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x79df, 0x009e, 0x0005, ++ 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, ++ 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, ++ 0xd1cc, 0x0110, 0x080c, 0x2809, 0x080c, 0x8202, 0x6014, 0x2048, ++ 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x79df, 0x080c, 0x9554, 0x009e, ++ 0x0005, 0x080c, 0xcbc7, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, ++ 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x80d6, 0x080c, 0x8202, ++ 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, ++ 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, ++ 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, ++ 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xc970, 0x6018, ++ 0x9005, 0x1128, 0x2001, 0x1954, 0x2004, 0x8003, 0x601a, 0x6017, ++ 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, ++ 0x0002, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, ++ 0xc37d, 0xc37f, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, ++ 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc3ca, 0x080c, 0x0d84, 0x6014, ++ 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, ++ 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, ++ 0x2009, 0x0041, 0x00de, 0x0804, 0xc3ee, 0x6003, 0x0007, 0x601b, ++ 0x0000, 0x080c, 0x79df, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, ++ 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, ++ 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, ++ 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, ++ 0x180d, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, ++ 0x0006, 0x00e9, 0x080c, 0x79e1, 0x009e, 0x0005, 0x6003, 0x0002, ++ 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1489, 0x1904, ++ 0xc37f, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, ++ 0x9105, 0x1120, 0x080c, 0x1489, 0x1904, 0xc37f, 0x0005, 0xd2fc, ++ 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, ++ 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, ++ 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, ++ 0x0d84, 0x6024, 0xd0dc, 0x090c, 0x0d84, 0x0005, 0xc411, 0xc418, ++ 0xc424, 0xc430, 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc413, ++ 0xc413, 0xc411, 0xc411, 0xc411, 0xc411, 0xc413, 0xc411, 0xc413, ++ 0xc411, 0x080c, 0x0d84, 0x6024, 0xd0dc, 0x090c, 0x0d84, 0x0005, ++ 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x8125, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, ++ 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, ++ 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x18b7, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x7c3a, 0x080c, 0x820b, 0x012e, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, ++ 0x003e, 0x012e, 0x0005, 0xc45b, 0xc45d, 0xc46f, 0xc489, 0xc45b, ++ 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, ++ 0xc45b, 0xc45b, 0xc45b, 0x080c, 0x0d84, 0x6014, 0x2048, 0xa87c, ++ 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, ++ 0x0001, 0x6106, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0470, 0x6014, ++ 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, ++ 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x080c, 0x8125, ++ 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xc970, ++ 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, ++ 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, ++ 0x18b7, 0x080c, 0x7c3a, 0x080c, 0x820b, 0x0005, 0x080c, 0x8026, ++ 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xcc6b, 0x0036, ++ 0x2019, 0x0029, 0x080c, 0xc970, 0x003e, 0x009e, 0x080c, 0x9584, ++ 0x080c, 0x8125, 0x0005, 0x080c, 0x80d6, 0x6114, 0x81ff, 0x0158, ++ 0x0096, 0x2148, 0x080c, 0xcc6b, 0x0036, 0x2019, 0x0029, 0x080c, ++ 0xc970, 0x003e, 0x009e, 0x080c, 0x9584, 0x080c, 0x820b, 0x0005, ++ 0x9182, 0x0085, 0x0002, 0xc4da, 0xc4d8, 0xc4d8, 0xc4e6, 0xc4d8, ++ 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, ++ 0x080c, 0x0d84, 0x6003, 0x000b, 0x6106, 0x080c, 0x7bcb, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, 0x0026, 0x00e6, ++ 0x080c, 0xcbbe, 0x0118, 0x080c, 0x9554, 0x0440, 0x2071, 0x0260, ++ 0x7224, 0x6216, 0x2001, 0x180d, 0x2004, 0xd0e4, 0x0150, 0x6010, ++ 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, ++ 0x9844, 0x7220, 0x080c, 0xc816, 0x0118, 0x6007, 0x0086, 0x0040, ++ 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, ++ 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x002e, ++ 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, ++ 0x0d84, 0x908a, 0x0092, 0x1a0c, 0x0d84, 0x9082, 0x0085, 0x00a2, ++ 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x95e9, ++ 0x0050, 0x2001, 0x0007, 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, ++ 0x9584, 0x080c, 0x8125, 0x0005, 0xc549, 0xc54b, 0xc54b, 0xc549, ++ 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, ++ 0xc549, 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, ++ 0x8125, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d84, 0x9182, 0x0092, ++ 0x1a0c, 0x0d84, 0x9182, 0x0085, 0x0002, 0xc56a, 0xc56a, 0xc56a, ++ 0xc56c, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, ++ 0xc56a, 0xc56a, 0x080c, 0x0d84, 0x0005, 0x9186, 0x0013, 0x0148, ++ 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x95e9, ++ 0x0030, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, 0x0005, ++ 0x0036, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, ++ 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, ++ 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x8ef6, ++ 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x8f9a, 0x007e, ++ 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, ++ 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xcc1f, 0x080c, ++ 0xb76f, 0x080c, 0x17b0, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, ++ 0xb0ad, 0x0110, 0x080c, 0xc970, 0x009e, 0x6017, 0x0000, 0x080c, ++ 0xcc1f, 0x6023, 0x0007, 0x080c, 0xb76f, 0x003e, 0x012e, 0x0005, ++ 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, ++ 0x783c, 0x080c, 0x23fd, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x5c0d, ++ 0x1580, 0x001e, 0x00c6, 0x2160, 0x080c, 0xb76c, 0x00ce, 0x002e, ++ 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x905b, 0x080c, 0x7d55, ++ 0x0076, 0x903e, 0x080c, 0x7c4d, 0x007e, 0x001e, 0x0076, 0x903e, ++ 0x080c, 0xc73e, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, ++ 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, ++ 0x2dd3, 0x002e, 0x001e, 0x080c, 0x56f3, 0xbe12, 0xbd16, 0x9006, ++ 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, ++ 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1822, 0x2104, ++ 0x9086, 0x0074, 0x1904, 0xc66a, 0x2069, 0x0260, 0x6944, 0x9182, ++ 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xc667, 0x2001, ++ 0x194b, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005, ++ 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, ++ 0x080c, 0xccd1, 0x0118, 0x6978, 0xd1fc, 0x11b8, 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, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, ++ 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, ++ 0x0006, 0x0178, 0x9286, 0x0004, 0x0160, 0x9394, 0xff00, 0x8217, ++ 0x9286, 0x0006, 0x0130, 0x9286, 0x0004, 0x0118, 0x080c, 0x5c1c, ++ 0x04e0, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, ++ 0x000a, 0x080c, 0xa439, 0x009e, 0x1588, 0x2011, 0x027a, 0x20a9, ++ 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, ++ 0x1528, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1853, ++ 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xc9c5, 0xb800, ++ 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x2001, ++ 0x0007, 0x080c, 0x5b8d, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, ++ 0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, ++ 0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, ++ 0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, ++ 0x026c, 0x7930, 0x7834, 0x080c, 0x23fd, 0x11d0, 0x080c, 0x5c0d, ++ 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, ++ 0x000a, 0x080c, 0xa439, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, ++ 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, ++ 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, ++ 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, ++ 0x8211, 0x220c, 0x080c, 0x23fd, 0x11d0, 0x080c, 0x5c0d, 0x11b8, ++ 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, ++ 0x080c, 0xa439, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, ++ 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, 0x015e, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, ++ 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, ++ 0x8000, 0x2740, 0x2029, 0x19bd, 0x252c, 0x2021, 0x19c3, 0x2424, ++ 0x2061, 0x1cd0, 0x2071, 0x1800, 0x764c, 0x706c, 0x81ff, 0x0150, ++ 0x0006, 0x9186, 0x1a72, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, ++ 0xc7cf, 0x0018, 0x9606, 0x0904, 0xc7cf, 0x2100, 0x9c06, 0x0904, ++ 0xc7c6, 0x080c, 0xca01, 0x1904, 0xc7c6, 0x080c, 0xccd8, 0x0904, ++ 0xc7c6, 0x080c, 0xc9f1, 0x0904, 0xc7c6, 0x6720, 0x9786, 0x0001, ++ 0x1148, 0x080c, 0x2e64, 0x0904, 0xc7ea, 0x6004, 0x9086, 0x0000, ++ 0x1904, 0xc7ea, 0x9786, 0x0004, 0x0904, 0xc7ea, 0x9786, 0x0007, ++ 0x05e8, 0x2500, 0x9c06, 0x05d0, 0x2400, 0x9c06, 0x05b8, 0x88ff, ++ 0x0118, 0x6054, 0x9906, 0x1590, 0x0096, 0x6000, 0x9086, 0x0004, ++ 0x1120, 0x0016, 0x080c, 0x17b0, 0x001e, 0x9786, 0x0008, 0x1148, ++ 0x080c, 0xb295, 0x1130, 0x080c, 0x9e99, 0x009e, 0x080c, 0x9584, ++ 0x00e8, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x01a8, 0x9786, 0x0003, ++ 0x1540, 0x080c, 0xc810, 0x0110, 0xa867, 0x0103, 0xab7a, 0xa877, ++ 0x0000, 0x080c, 0xcc6b, 0x0016, 0x080c, 0xb374, 0x080c, 0x619c, ++ 0x001e, 0x080c, 0xb278, 0x009e, 0x080c, 0x9584, 0x9ce0, 0x0018, ++ 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xc752, 0x012e, ++ 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, ++ 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, ++ 0xcc6b, 0x080c, 0xc970, 0x08f8, 0x009e, 0x0c00, 0x9786, 0x000a, ++ 0x0968, 0x0838, 0x81ff, 0x09d0, 0x9180, 0x0001, 0x2004, 0x9086, ++ 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1970, ++ 0x6000, 0x9086, 0x0002, 0x1950, 0x080c, 0xb284, 0x0130, 0x080c, ++ 0xb295, 0x1920, 0x080c, 0x9e99, 0x0038, 0x080c, 0x2d3f, 0x080c, ++ 0xb295, 0x1110, 0x080c, 0x9e99, 0x080c, 0x9584, 0x0804, 0xc7c6, ++ 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, ++ 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xc997, 0x001e, 0x0120, ++ 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xc835, ++ 0xc835, 0xc835, 0xc835, 0xc835, 0xc835, 0xc837, 0xc835, 0xc835, ++ 0xc835, 0xc835, 0x9584, 0x9584, 0xc835, 0x9006, 0x0005, 0x0036, ++ 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, ++ 0x2009, 0x0020, 0x080c, 0xc9c5, 0x001e, 0x004e, 0x2019, 0x0002, ++ 0x080c, 0xc58e, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, ++ 0xb0ad, 0x0140, 0x6014, 0x904d, 0x080c, 0xad1e, 0x687b, 0x0005, ++ 0x080c, 0x61a9, 0x009e, 0x080c, 0x9584, 0x9085, 0x0001, 0x0005, ++ 0x2001, 0x0001, 0x080c, 0x5b4d, 0x0156, 0x0016, 0x0026, 0x0036, ++ 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xa425, ++ 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, ++ 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, ++ 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, 0xc8d0, ++ 0x2071, 0x1800, 0x764c, 0x706c, 0x8001, 0x9602, 0x1a04, 0xc8d0, ++ 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, 0xc9f1, ++ 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, 0x1538, ++ 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8, ++ 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084, ++ 0x0140, 0x080c, 0xcc1f, 0x080c, 0xb76f, 0x080c, 0x17b0, 0x6023, ++ 0x0007, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0120, 0x0046, 0x080c, ++ 0xc970, 0x004e, 0x009e, 0x080c, 0x9584, 0x88ff, 0x1198, 0x9ce0, ++ 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xc885, ++ 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, ++ 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x00b6, 0x0076, 0x0056, ++ 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, ++ 0x2258, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, ++ 0x080c, 0x8f9a, 0x080c, 0xc876, 0x005e, 0x007e, 0x00be, 0x0005, ++ 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, ++ 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5c0d, 0x1190, ++ 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, ++ 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, 0x080c, 0x8f9a, 0x080c, ++ 0xc876, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xc903, 0x015e, ++ 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, ++ 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, ++ 0x0048, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, ++ 0x080c, 0x8f9a, 0x2c20, 0x080c, 0xc876, 0x005e, 0x007e, 0x00be, ++ 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, ++ 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5c0d, 0x11a0, ++ 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xcc03, ++ 0x004e, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, ++ 0x080c, 0x8f9a, 0x080c, 0xc876, 0x003e, 0x001e, 0x8108, 0x1f04, ++ 0xc94b, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, ++ 0x0016, 0x00f6, 0x080c, 0xb0ab, 0x0198, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, ++ 0xab82, 0x080c, 0x61a9, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x61a9, ++ 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, ++ 0x080c, 0x61a9, 0x2f48, 0x0cb8, 0x080c, 0x61a9, 0x0c88, 0x00e6, ++ 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800, ++ 0x744c, 0x706c, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, ++ 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, 0x6010, ++ 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, ++ 0x1818, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, ++ 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, 0x080c, ++ 0x0fae, 0x000e, 0x090c, 0x0d84, 0xa867, 0x010d, 0xa88e, 0x0026, ++ 0x2010, 0x080c, 0xb09b, 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, ++ 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986, 0xac76, 0xa87f, 0x0000, ++ 0x2001, 0x195b, 0x2004, 0xa882, 0x9006, 0xa8e2, 0xa802, 0xa86a, ++ 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x009e, ++ 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001, 0x0140, ++ 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085, 0x0001, ++ 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, 0xb8a0, ++ 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, 0x0016, ++ 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, 0x00ff, ++ 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0005, ++ 0x2001, 0x1954, 0x2004, 0x601a, 0x080c, 0x7bcb, 0x080c, 0x8125, ++ 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, ++ 0xd0cc, 0x0118, 0x080c, 0xb3ae, 0x0030, 0x080c, 0xcc1f, 0x080c, ++ 0x79df, 0x080c, 0x9554, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, ++ 0x000f, 0x0002, 0xca50, 0xca50, 0xca50, 0xca52, 0xca50, 0xca52, ++ 0xca52, 0xca50, 0xca52, 0xca50, 0xca50, 0xca50, 0xca50, 0xca50, ++ 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, ++ 0x9084, 0x000f, 0x0002, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, ++ 0xca69, 0xca76, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, ++ 0xca69, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, ++ 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0005, 0x0096, 0x00c6, ++ 0x2260, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, ++ 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, ++ 0x1904, 0xcad0, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, ++ 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00c6, 0x2d60, 0x6100, 0x9186, ++ 0x0002, 0x1904, 0xcb48, 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, ++ 0x0007, 0x190c, 0x0d84, 0x0804, 0xcb48, 0x2048, 0x080c, 0xb0ad, ++ 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, ++ 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1170, 0xa87c, 0xc0dc, ++ 0xc0f4, 0xa87e, 0xa880, 0xc0f4, 0xc0fc, 0xa882, 0x2009, 0x0043, ++ 0x080c, 0xc3ee, 0x0804, 0xcb48, 0x2009, 0x0041, 0x0804, 0xcb42, ++ 0x9186, 0x0005, 0x15a8, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, ++ 0x00de, 0x009e, 0x0804, 0xca69, 0xd0b4, 0x0128, 0xd0fc, 0x090c, ++ 0x0d84, 0x0804, 0xca8a, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, ++ 0x0120, 0x9186, 0x0004, 0x1904, 0xcb48, 0x6814, 0x2048, 0xa97c, ++ 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1f4, 0xc1fc, 0xc1bc, 0xa982, ++ 0x00f6, 0x2c78, 0x080c, 0x150d, 0x00fe, 0x2009, 0x0042, 0x04d0, ++ 0x0036, 0x080c, 0x0fae, 0x090c, 0x0d84, 0xa867, 0x010d, 0x9006, ++ 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, ++ 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, ++ 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, 0xa876, ++ 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, ++ 0x61a9, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xc58e, 0x2d00, ++ 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x6342, ++ 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, 0xc3ee, ++ 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, ++ 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, ++ 0x8026, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, ++ 0xc970, 0x009e, 0x003e, 0x080c, 0x8125, 0x0005, 0x9186, 0x0014, ++ 0x0d70, 0x080c, 0x95e9, 0x0005, 0xcb7b, 0xcb79, 0xcb79, 0xcb79, ++ 0xcb79, 0xcb79, 0xcb7b, 0xcb79, 0xcb79, 0xcb79, 0xcb79, 0xcb79, ++ 0xcb79, 0x080c, 0x0d84, 0x080c, 0x8026, 0x6003, 0x000c, 0x080c, ++ 0x8125, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, ++ 0x001a, 0x080c, 0x95e9, 0x0005, 0xcb99, 0xcb99, 0xcb99, 0xcb99, ++ 0xcb9b, 0xcbbb, 0xcb99, 0xcb99, 0xcb99, 0xcb99, 0xcb99, 0xcb99, ++ 0xcb99, 0x080c, 0x0d84, 0x00d6, 0x2c68, 0x080c, 0x94fe, 0x01b0, ++ 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, ++ 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, ++ 0x6023, 0x0004, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, 0x080c, ++ 0x9554, 0x00de, 0x0005, 0x080c, 0x9554, 0x0005, 0x00e6, 0x6010, ++ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, ++ 0x1872, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, ++ 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1955, 0x2004, 0x6042, 0x2009, ++ 0x1872, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1872, 0x210c, ++ 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, ++ 0x1955, 0x200c, 0x2001, 0x1953, 0x2004, 0x9100, 0x9080, 0x000a, ++ 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104, ++ 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, ++ 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0xb8ac, ++ 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, 0x1138, ++ 0x600c, 0x2072, 0x080c, 0x79df, 0x080c, 0x9554, 0x0010, 0x9cf0, ++ 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, ++ 0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130, 0x9c06, ++ 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005, ++ 0x0026, 0x0036, 0x0156, 0x2011, 0x182a, 0x2204, 0x9084, 0x00ff, ++ 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204, ++ 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004, ++ 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa439, 0x009e, ++ 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, ++ 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, 0x1100, 0x015e, 0x003e, ++ 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5677, 0x080c, ++ 0x2b1e, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, ++ 0xa882, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, ++ 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bd, 0x252c, ++ 0x2021, 0x19c3, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x764c, ++ 0x706c, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, ++ 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, ++ 0x080c, 0xc9f1, 0x01b8, 0x080c, 0xca01, 0x11a0, 0x6000, 0x9086, ++ 0x0004, 0x1120, 0x0016, 0x080c, 0x17b0, 0x001e, 0x080c, 0xb284, ++ 0x1110, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x1110, 0x080c, 0x9e99, ++ 0x080c, 0x9584, 0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, ++ 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, ++ 0x007e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x180f, 0x2004, 0xd0dc, ++ 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005, ++ 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x905b, 0x080c, 0x9584, ++ 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, ++ 0x2071, 0x1840, 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, 0x184a, 0x0089, 0x001e, 0x00ee, 0x000e, ++ 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, ++ 0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000, ++ 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6, ++ 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844, ++ 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, ++ 0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e, ++ 0x0005, 0x0002, 0x0003, 0x03d6, 0x0000, 0x8064, 0x0008, 0x0010, ++ 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4406, 0x000b, 0x8060, ++ 0x0000, 0x0400, 0x0000, 0x580c, 0x0003, 0x7934, 0x000b, 0x5090, ++ 0x000b, 0x4c09, 0x0003, 0xbac0, 0x0009, 0x0082, 0x0008, 0x0c09, ++ 0x000b, 0x15fe, 0x0008, 0x3409, 0x0003, 0x808c, 0x0008, 0x0001, ++ 0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, ++ 0x0000, 0x081b, 0x0003, 0x4022, 0x0000, 0x001c, 0x0003, 0x4122, ++ 0x0008, 0x4447, 0x0002, 0x0de7, 0x0003, 0x0bfe, 0x0008, 0x11a0, ++ 0x0001, 0x11c9, 0x000b, 0x0ca0, 0x0001, 0x11c9, 0x000b, 0x9180, ++ 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, ++ 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x442a, 0x0003, 0x808c, ++ 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, ++ 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x4432, 0x0003, 0x03fe, ++ 0x0000, 0x43e0, 0x0001, 0x0dc6, 0x0003, 0xc2c0, 0x0009, 0x00ff, ++ 0x0008, 0x02e0, 0x0001, 0x0dc6, 0x0003, 0x9180, 0x0001, 0x0005, ++ 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, ++ 0x0000, 0x0019, 0x0000, 0x4441, 0x000b, 0x0240, 0x0002, 0x09c3, ++ 0x000b, 0x00fe, 0x0000, 0x31c6, 0x0003, 0x112a, 0x0000, 0x002e, ++ 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x808c, ++ 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, ++ 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4452, 0x0003, 0x01fe, ++ 0x0008, 0x42e0, 0x0009, 0x0db9, 0x000b, 0x00fe, 0x0000, 0x43e0, ++ 0x0001, 0x0db9, 0x000b, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, ++ 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, ++ 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, ++ 0x0008, 0x4464, 0x0003, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, ++ 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x586a, 0x0003, 0x8066, ++ 0x0000, 0x3679, 0x0000, 0x446d, 0x0003, 0x586e, 0x000b, 0x8054, ++ 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, ++ 0x0000, 0x3009, 0x000b, 0x0077, 0x0004, 0x0009, 0x000b, 0x1c60, ++ 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x447b, ++ 0x000b, 0x587c, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43, ++ 0x0002, 0x0c86, 0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348, ++ 0x0008, 0x044a, 0x0008, 0x008a, 0x0003, 0x0344, 0x0008, 0x0446, ++ 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x588a, 0x000b, 0x8054, ++ 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, ++ 0x000f, 0x3a40, 0x000a, 0x0c0c, 0x000b, 0x2b24, 0x0008, 0x2b24, ++ 0x0008, 0x5894, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, ++ 0x0002, 0x08d8, 0x0003, 0x3a45, 0x000a, 0x08c9, 0x0003, 0x1e10, ++ 0x000a, 0x7f3c, 0x0000, 0x08c6, 0x0003, 0x1d00, 0x0002, 0x7f3a, ++ 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, ++ 0x0008, 0x44a4, 0x0003, 0x00fe, 0x0000, 0x34c3, 0x0003, 0x1c60, ++ 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, ++ 0x0008, 0x44ac, 0x000b, 0x00fe, 0x0000, 0x31a2, 0x000b, 0x0038, ++ 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, ++ 0x0000, 0x0009, 0x0008, 0x44b5, 0x0003, 0x80c0, 0x0009, 0x00ff, ++ 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, ++ 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44bf, ++ 0x0003, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x00a0, 0x000b, 0x0036, ++ 0x0008, 0x0077, 0x0004, 0x00d8, 0x000b, 0x8074, 0x0000, 0x2000, ++ 0x0000, 0x00d8, 0x000b, 0x3a44, 0x0002, 0x09cc, 0x000b, 0x8074, ++ 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x0000, 0x35a2, ++ 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, ++ 0x0008, 0x00d0, 0x0009, 0x0ce6, 0x0003, 0x8074, 0x0000, 0x4040, ++ 0x0008, 0x58d8, 0x0003, 0x5090, 0x000b, 0x3a46, 0x000a, 0x0ce6, ++ 0x0003, 0x3a47, 0x0002, 0x08e3, 0x000b, 0x8054, 0x0008, 0x0004, ++ 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0127, 0x0003, 0x92c0, ++ 0x0009, 0x0f88, 0x0008, 0x0809, 0x0003, 0x1a60, 0x0000, 0x8062, ++ 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, 0x362a, 0x0000, 0x44eb, ++ 0x000b, 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, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, ++ 0x0000, 0x0052, 0x0000, 0x4505, 0x0003, 0x92c0, 0x0009, 0x0780, ++ 0x0008, 0x0db3, 0x000b, 0x124b, 0x0002, 0x090e, 0x0003, 0x2e4d, ++ 0x0002, 0x2e4d, 0x0002, 0x09a2, 0x0003, 0x3a46, 0x000a, 0x0d1b, ++ 0x0003, 0x5910, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x1243, ++ 0x000a, 0x0925, 0x0003, 0x8010, 0x0008, 0x000d, 0x0000, 0x0193, ++ 0x000c, 0x1810, 0x0000, 0x0193, 0x000c, 0x0125, 0x000b, 0x194d, ++ 0x000a, 0x091f, 0x0003, 0x1243, 0x000a, 0x09a9, 0x000b, 0x591f, ++ 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x0188, 0x000c, 0x1810, ++ 0x0000, 0x0193, 0x000c, 0x8074, 0x0000, 0xf000, 0x0008, 0x3a42, ++ 0x0002, 0x0d2d, 0x0003, 0x15fe, 0x0008, 0x344b, 0x0003, 0x0d30, ++ 0x0000, 0x0009, 0x000b, 0x0d30, 0x0000, 0x8074, 0x0000, 0x0501, ++ 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x0193, 0x000c, 0x0009, ++ 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d44, 0x0003, 0x18fe, ++ 0x0000, 0x3ce0, 0x0009, 0x0941, 0x000b, 0x15fe, 0x0008, 0x3ce0, ++ 0x0009, 0x0941, 0x000b, 0x0183, 0x0004, 0x8076, 0x0008, 0x0040, ++ 0x0000, 0x0180, 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x0180, ++ 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d49, 0x000b, 0x3c1e, ++ 0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0d65, ++ 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d41, 0x0003, 0x1a60, ++ 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 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, 0x0127, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0d77, ++ 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0974, 0x000b, 0x15fe, ++ 0x0008, 0x3ce0, 0x0009, 0x0d3d, 0x000b, 0x0183, 0x0004, 0x8076, ++ 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x01c3, ++ 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x0180, 0x000b, 0xbbe0, ++ 0x0009, 0x0016, 0x0000, 0x0d80, 0x000b, 0x3a44, 0x0002, 0x0c0b, ++ 0x0003, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, 0x0009, ++ 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x0009, 0x000b, 0x3d30, ++ 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, 0x018c, ++ 0x000b, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007, ++ 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, ++ 0x0000, 0x000a, 0x0008, 0x4591, 0x000b, 0x4000, 0x000f, 0x2193, ++ 0x000b, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, 0x0090, ++ 0x0008, 0x099c, 0x000b, 0x8074, 0x0000, 0x0706, 0x0000, 0x019e, ++ 0x000b, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010, ++ 0x0008, 0x0008, 0x0000, 0x01d1, 0x0003, 0x0188, 0x000c, 0x8010, ++ 0x0008, 0x0007, 0x0000, 0x0193, 0x000c, 0x1810, 0x0000, 0x0193, ++ 0x000c, 0x01db, 0x0003, 0x0188, 0x000c, 0x8010, 0x0008, 0x001b, ++ 0x0008, 0x0193, 0x000c, 0x1810, 0x0000, 0x0193, 0x000c, 0x8074, ++ 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x0009, 0x000b, 0x8010, ++ 0x0008, 0x0009, 0x0008, 0x01d1, 0x0003, 0x8010, 0x0008, 0x0005, ++ 0x0008, 0x01d1, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010, ++ 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x0859, 0x0003, 0x3a44, ++ 0x0002, 0x0c09, 0x000b, 0x0d2a, 0x0008, 0x01d1, 0x0003, 0x8010, ++ 0x0008, 0x0003, 0x0008, 0x01d3, 0x000b, 0x8010, 0x0008, 0x000b, ++ 0x0000, 0x01d3, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, 0x01d3, ++ 0x000b, 0x3a47, 0x0002, 0x0cd8, 0x000b, 0x8010, 0x0008, 0x0006, ++ 0x0008, 0x01d3, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, 0x0193, ++ 0x000c, 0x0196, 0x000c, 0x3a40, 0x000a, 0x0809, 0x0003, 0x8010, ++ 0x0008, 0x000c, 0x0008, 0x0193, 0x000c, 0x0009, 0x000b, 0x8074, ++ 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d, ++ 0x0002, 0x09e4, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x0009, ++ 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x0009, 0x000b, 0x3a44, ++ 0x0002, 0x0c09, 0x000b, 0x01c6, 0x0003, 0xc993, 0xf609, 0x0001, ++ 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, ++ 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xd29e ++}; ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_length01 = 0xc920; ++#else ++unsigned short risc_code_length01 = 0xc920; ++#endif ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfg.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,2780 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support Driver ++ * ++ */ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "qlfo.h" ++ ++/* ++ * Local Function Prototypes. ++ */ ++ ++static uint32_t qla2x00_add_portname_to_mp_dev(mp_device_t *, uint8_t *); ++ ++static mp_device_t * qla2x00_allocate_mp_dev(uint8_t *, uint8_t *); ++static mp_path_t * qla2x00_allocate_path(mp_host_t *, uint16_t, fc_port_t *, ++ uint16_t); ++static mp_path_list_t * qla2x00_allocate_path_list(void); ++ ++static mp_host_t * qla2x00_find_host_by_name(uint8_t *); ++ ++static mp_device_t * qla2x00_find_or_allocate_mp_dev (mp_host_t *, uint16_t, ++ fc_port_t *); ++static mp_path_t * qla2x00_find_or_allocate_path(mp_host_t *, mp_device_t *, ++ uint16_t, fc_port_t *); ++ ++static uint32_t qla2x00_cfg_register_failover_lun(mp_device_t *,srb_t *, ++ fc_lun_t *); ++static uint32_t qla2x00_send_failover_notify(mp_device_t *, uint8_t, ++ mp_path_t *, mp_path_t *); ++static mp_path_t * qla2x00_select_next_path(mp_host_t *, mp_device_t *, ++ uint8_t); ++ ++static uint8_t qla2x00_update_mp_host(mp_host_t *); ++static uint32_t qla2x00_update_mp_tree (void); ++ ++static fc_lun_t *qla2x00_find_matching_lun(uint8_t , mp_path_t *); ++static mp_path_t *qla2x00_find_path_by_id(mp_device_t *, uint8_t); ++static mp_device_t *qla2x00_find_mp_dev_by_id(mp_host_t *, uint8_t); ++static mp_device_t *qla2x00_find_mp_dev_by_name(mp_host_t *, uint8_t *); ++ ++static mp_path_t *qla2x00_get_visible_path(mp_device_t *dp); ++static void qla2x00_map_os_targets(mp_host_t *); ++static void qla2x00_map_os_luns(mp_host_t *, mp_device_t *, uint16_t); ++static uint8_t qla2x00_map_a_oslun(mp_host_t *, mp_device_t *, uint16_t, uint16_t); ++ ++static uint8_t qla2x00_is_ww_name_zero(uint8_t *); ++static void qla2x00_add_path(mp_path_list_t *, mp_path_t *); ++static void qla2x00_failback_single_lun(mp_device_t *, uint8_t, uint8_t); ++static void qla2x00_failback_luns(mp_host_t *); ++static void qla2x00_setup_new_path(mp_device_t *, mp_path_t *); ++ ++/* ++ * Global data items ++ */ ++mp_host_t *mp_hosts_base = NULL; ++uint8_t mp_config_required = FALSE; ++static int mp_num_hosts = 0; ++static uint8_t mp_initialized = FALSE; ++ ++ ++/* ++ * ENTRY ROUTINES ++ */ ++ ++/* ++ * qla2x00_cfg_init ++ * Initialize configuration structures to handle an instance of ++ * an HBA, QLA2x000 card. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_init(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ENTER("qla2x00_cfg_init"); ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ if (!mp_initialized) { ++ /* First HBA, initialize the failover global properties */ ++ qla2x00_fo_init_params(ha); ++ ++ /* If the user specified a device configuration then ++ * it is use as the configuration. Otherwise, we wait ++ * for path discovery. ++ */ ++ if ( mp_config_required ) ++ qla2x00_cfg_build_path_tree(ha); ++ } ++ rval = qla2x00_cfg_path_discovery(ha); ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ LEAVE("qla2x00_cfg_init"); ++ return rval; ++} ++ ++/* ++ * qla2x00_cfg_path_discovery ++ * Discover the path configuration from the device configuration ++ * for the specified host adapter and build the path search tree. ++ * This function is called after the lower level driver has ++ * completed its port and lun discovery. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_path_discovery(scsi_qla_host_t *ha) ++{ ++ int rval = QLA2X00_SUCCESS; ++ mp_host_t *host; ++ uint8_t *name; ++ ++ ENTER("qla2x00_cfg_path_discovery"); ++ ++ name = &ha->init_cb->node_name[0]; ++ ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ /* Initialize the path tree for this adapter */ ++ host = qla2x00_find_host_by_name(name); ++ if ( mp_config_required ) { ++ if (host == NULL ) { ++ DEBUG4(printk("cfg_path_discovery: host not found, " ++ "node name = " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ name[0], name[1], name[2], name[3], ++ name[4], name[5], name[6], name[7]);) ++ rval = QLA2X00_FUNCTION_FAILED; ++ } else if (ha->instance != host->instance) { ++ DEBUG4(printk("cfg_path_discovery: host instance " ++ "don't match - instance=%ld.\n", ++ ha->instance);) ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } else if ( host == NULL ) { ++ /* New host adapter so allocate it */ ++ if ( (host = qla2x00_alloc_host(ha)) == NULL ) { ++ printk(KERN_INFO ++ "qla2x00(%d): Couldn't allocate " ++ "host - ha = %p.\n", ++ (int)ha->instance, ha); ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ /* Fill in information about host */ ++ if (host != NULL ) { ++ host->flags |= MP_HOST_FLAG_NEEDS_UPDATE; ++ host->flags |= MP_HOST_FLAG_LUN_FO_ENABLED; ++ host->fcports = &ha->fcports; ++ ++ /* Check if multipath is enabled */ ++ if (!qla2x00_update_mp_host(host)) { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ host->flags &= ~MP_HOST_FLAG_LUN_FO_ENABLED; ++ } ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("qla2x00_path_discovery: Exiting FAILED\n");) ++ } else { ++ LEAVE("qla2x00_cfg_path_discovery"); ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_cfg_event_notifiy ++ * Callback for host driver to notify us of configuration changes. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * i_type = event type ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_event_notify(scsi_qla_host_t *ha, uint32_t i_type) ++{ ++ mp_host_t *host; /* host adapter pointer */ ++ ++ ENTER("qla2x00_cfg_event_notify"); ++ ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ switch (i_type) { ++ case MP_NOTIFY_RESET_DETECTED: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_RESET_DETECTED " ++ "- no action\n", ++ ha->host_no);) ++ break; ++ case MP_NOTIFY_PWR_LOSS: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_PWR_LOSS - " ++ "update tree\n", ++ ha->host_no);) ++ /* ++ * Update our path tree in case we are ++ * losing the adapter ++ */ ++ qla2x00_update_mp_tree(); ++ /* Free our resources for adapter */ ++ break; ++ case MP_NOTIFY_LOOP_UP: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_LOOP_UP - " ++ "update host tree\n", ++ ha->host_no);) ++ /* Adapter is back up with new configuration */ ++ if ((host = qla2x00_cfg_find_host(ha)) != NULL) { ++ host->flags |= MP_HOST_FLAG_NEEDS_UPDATE; ++ host->fcports = &ha->fcports; ++ qla2x00_update_mp_tree(); ++ } ++ break; ++ case MP_NOTIFY_LOOP_DOWN: ++ case MP_NOTIFY_BUS_RESET: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_OTHERS - " ++ "no action\n", ++ ha->host_no);) ++ break; ++ default: ++ break; ++ ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ LEAVE("qla2x00_cfg_event_notify"); ++ ++ return QLA2X00_SUCCESS; ++} ++ ++/* ++ * qla2x00_cfg_failover ++ * A problem has been detected with the current path for this ++ * lun. Select the next available path as the current path ++ * for this device. ++ * ++ * Inputs: ++ * ha = pointer to host adapter ++ * fp - pointer to failed fc_lun (failback lun) ++ * tgt - pointer to target ++ * ++ * Returns: ++ * pointer to new fc_lun_t, or NULL if failover fails. ++ */ ++fc_lun_t * ++qla2x00_cfg_failover(scsi_qla_host_t *ha, fc_lun_t *fp, ++ os_tgt_t *tgt, srb_t *sp) ++{ ++ mp_host_t *host; /* host adapter pointer */ ++ mp_device_t *dp; /* virtual device pointer */ ++ mp_path_t *new_path; /* new path pointer */ ++ fc_lun_t *new_fp = NULL; ++ ++ ENTER("qla2x00_cfg_failover"); ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ if ((host = qla2x00_cfg_find_host(ha)) != NULL) { ++ if ((dp = qla2x00_find_mp_dev_by_name( ++ host, tgt->node_name)) != NULL ) { ++ ++ DEBUG3(printk("qla2x00_cfg_failover: dp = %p\n", dp);) ++ /* ++ * Point at the next path in the path list if there is ++ * one, and if it hasn't already been failed over by ++ * another I/O. If there is only one path continuer ++ * to point at it. ++ */ ++ new_path = qla2x00_select_next_path(host, dp, fp->lun); ++ DEBUG3(printk("cfg_failover: new path @ %p\n", ++ new_path);) ++ new_fp = qla2x00_find_matching_lun(fp->lun, new_path); ++ DEBUG3(printk("cfg_failover: new fp lun @ %p\n", ++ new_fp);) ++ ++ qla2x00_cfg_register_failover_lun(dp, sp, new_fp); ++ } else { ++ printk(KERN_INFO ++ "qla2x00(%d): Couldn't find device " ++ "to failover\n", ++ host->instance); ++ } ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ LEAVE("qla2x00_cfg_failover"); ++ ++ return new_fp; ++} ++ ++/* ++ * IOCTL support ++ */ ++#define CFG_IOCTL ++#if defined(CFG_IOCTL) ++/* ++ * qla2x00_cfg_get_paths ++ * Get list of paths EXT_FO_GET_PATHS. ++ * ++ * Input: ++ * ha = pointer to adapter ++ * bp = pointer to buffer ++ * cmd = Pointer to kernel copy of EXT_IOCTL. ++ * ++ * Return; ++ * 0 on success or errno. ++ * driver ioctl errors are returned via cmd->Status. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO_GET_PATHS *bp, int mode) ++{ ++ FO_PATHS_INFO *paths, *u_paths; ++ FO_PATH_ENTRY *entry; ++ EXT_DEST_ADDR *sap = &bp->HbaAddr; ++ mp_host_t *host = NULL; /* host adapter pointer */ ++ mp_device_t *dp; /* virtual device pointer */ ++ mp_path_t *path; /* path pointer */ ++ mp_path_list_t *path_list; /* path list pointer */ ++ int cnt; ++ int rval = 0; ++ scsi_qla_host_t *ha; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ u_paths = (FO_PATHS_INFO *) cmd->ResponseAdr; ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (rval); ++ } ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_HBA_INST; ++ DEBUG4(printk("%s: cannot find target (%ld)\n", ++ __func__, ha->instance);) ++ DEBUG9_10(printk("%s: cannot find host inst(%ld).\n", ++ __func__, ha->instance);) ++ ++ return rval; ++ } ++ ++ paths = (FO_PATHS_INFO *)qla2x00_kmem_zalloc( ++ sizeof(FO_PATHS_INFO), GFP_ATOMIC, 20); ++ if (paths == NULL) { ++ DEBUG4(printk("%s: failed to allocate memory of size (%d)\n", ++ __func__, (int)sizeof(FO_PATHS_INFO));) ++ DEBUG9_10(printk("%s: failed allocate memory size(%d).\n", ++ __func__, (int)sizeof(FO_PATHS_INFO));) ++ ++ cmd->Status = EXT_STATUS_NO_MEMORY; ++ ++ return -ENOMEM; ++ } ++ ++ if (!ha->flags.failover_enabled) { ++ /* non-fo case. There's only one path. */ ++ ++ mp_path_list_t *ptmp_plist; ++#define STD_MAX_PATH_CNT 1 ++#define STD_VISIBLE_INDEX 0 ++ int found; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ DEBUG9(printk("%s: non-fo case.\n", __func__);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_plist, ++ sizeof(mp_path_list_t))) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "lun_mask requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(mp_path_list_t));) ++ cmd->Status = EXT_STATUS_NO_MEMORY; ++ ++ return -ENOMEM; ++ } ++ ++ found = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (memcmp(fcport->node_name, sap->DestAddr.WWNN, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ found++; ++ break; ++ } ++ } ++ ++ if (found) { ++ DEBUG9(printk("%s: found fcport:" ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ ++ paths->HbaInstance = bp->HbaInstance; ++ paths->PathCount = STD_MAX_PATH_CNT; ++ paths->VisiblePathIndex = STD_VISIBLE_INDEX; ++ ++ /* Copy current path, which is the first one (0). */ ++ memcpy(paths->CurrentPathIndex, ptmp_plist->current_path, ++ sizeof(paths->CurrentPathIndex)); ++ ++ entry = &(paths->PathEntry[STD_VISIBLE_INDEX]); ++ ++ entry->Visible = TRUE; ++ entry->HbaInstance = bp->HbaInstance; ++ ++ memcpy(entry->PortName, fcport->port_name, ++ EXT_DEF_WWP_NAME_SIZE); ++ ++ rval = verify_area(VERIFY_WRITE, (void *)u_paths, ++ cmd->ResponseLen); ++ if (rval) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_paths %p verify write" ++ " error. paths->PathCount=%d.\n", ++ __func__, u_paths, paths->PathCount);) ++ } ++ ++ /* Copy data to user */ ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathCount, ++ &paths->PathCount, 4); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->CurrentPathIndex, ++ &paths->CurrentPathIndex, ++ sizeof(paths->CurrentPathIndex)); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathEntry, ++ &paths->PathEntry, ++ sizeof(paths->PathEntry)); ++ ++ if (rval) { /* if any of the above failed */ ++ DEBUG9_10(printk("%s: data copy failed.\n", ++ __func__);) ++ ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ } ++ } else { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ ++ DEBUG10(printk("%s: cannot find fcport " ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ DEBUG4(printk("%s: cannot find fcport " ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ } ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ /* end of non-fo case. */ ++ ++ } else if (sap->DestType != EXT_DEF_DESTTYPE_WWNN) { ++ /* Scan for mp_dev by nodename *ONLY* */ ++ ++ cmd->Status = EXT_STATUS_INVALID_PARAM; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ ++ DEBUG4(printk("%s: target can be accessed by NodeName only.", ++ __func__);) ++ DEBUG10(printk("%s: target can be accessed by NodeName only. " ++ "got type %d.\n", ++ __func__, sap->DestType);) ++ ++ } else if ((dp = qla2x00_find_mp_dev_by_name(host, ++ sap->DestAddr.WWNN)) != NULL) { ++ DEBUG9(printk("%s: Found mp_dev:" ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ ++ path_list = dp->path_list; ++ ++ paths->HbaInstance = bp->HbaInstance; ++ paths->PathCount = path_list->path_cnt; ++ paths->VisiblePathIndex = path_list->visible; ++ ++ /* copy current paths */ ++ memcpy(paths->CurrentPathIndex, ++ path_list->current_path, ++ sizeof(paths->CurrentPathIndex)); ++ ++ path = path_list->last; ++ for (cnt = 0; cnt < path_list->path_cnt; cnt++) { ++ entry = &(paths->PathEntry[path->id]); ++ ++ entry->Visible = (path->id == path_list->visible); ++ entry->HbaInstance = path->host->instance; ++ ++ memcpy(entry->PortName, ++ path->portname, ++ EXT_DEF_WWP_NAME_SIZE); ++ ++ path = path->next; ++ } ++ ++ rval = verify_area(VERIFY_WRITE, (void *)u_paths, ++ cmd->ResponseLen); ++ if (rval) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_paths %p verify write" ++ " error. paths->PathCount=%d.\n", ++ __func__, u_paths, paths->PathCount);) ++ } ++ ++ /* copy data to user */ ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathCount, ++ &paths->PathCount, 4); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->CurrentPathIndex, ++ &paths->CurrentPathIndex, ++ sizeof(paths->CurrentPathIndex)); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathEntry, ++ &paths->PathEntry, ++ sizeof(paths->PathEntry)); ++ ++ if (rval != 0) { /* if any of the above failed */ ++ DEBUG9_10(printk("%s: u_paths %p copy" ++ " error. paths->PathCount=%d.\n", ++ __func__, u_paths, paths->PathCount);) ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ } ++ ++ } else { ++ ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ ++ DEBUG4(printk("%s: cannot find device " ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ } ++ ++ KMEM_FREE(paths, sizeof(FO_PATHS_INFO)); ++ ++ DEBUG9(printk("%s: exiting. rval=%d.\n", __func__, rval);) ++ ++ return rval; ++ ++} /* qla2x00_cfg_get_paths */ ++ ++/* ++ * qla2x00_cfg_set_current_path ++ * Set the current failover path EXT_FO_GET_PATHS IOCTL call. ++ * ++ * Input: ++ * ha = pointer to adapter ++ * bp = pointer to buffer ++ * cmd = Pointer to kernel copy of EXT_IOCTL. ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_set_current_path(EXT_IOCTL *cmd, FO_SET_CURRENT_PATH *bp, int mode ) ++{ ++ uint8_t orig_id, new_id; ++ mp_host_t *host, *new_host; ++ mp_device_t *dp; ++ mp_path_list_t *path_list; ++ EXT_DEST_ADDR *sap = &bp->HbaAddr; ++ uint32_t rval = 0; ++ scsi_qla_host_t *ha; ++ mp_path_t *new_path, *old_path; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ /* First find the adapter with the instance number. */ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (rval); ++ } ++ ++ if (!ha->flags.failover_enabled) ++ /* non-failover mode. nothing to be done. */ ++ return 0; ++ ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_HBA_INST; ++ DEBUG4(printk("%s: cannot find adapter.\n", ++ __func__);) ++ return (rval); ++ } ++ ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ sap = &bp->HbaAddr; ++ /* Scan for mp_dev by nodename *ONLY* */ ++ if (sap->DestType != EXT_DEF_DESTTYPE_WWNN) { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ DEBUG4(printk("%s: target can be accessed by NodeName only.", ++ __func__);) ++ DEBUG9_10(printk("%s: target can be accessed by NodeName only.", ++ __func__);) ++ } else if ((dp = qla2x00_find_mp_dev_by_name( ++ host, sap->DestAddr.WWNN)) != NULL) { ++ ++ path_list = dp->path_list; ++ ++ if (bp->NewCurrentPathIndex < MAX_PATHS_PER_DEVICE && ++ sap->Lun < MAX_LUNS && ++ bp->NewCurrentPathIndex < path_list->path_cnt) { ++ ++ orig_id = path_list->current_path[sap->Lun]; ++ ++ DEBUG(printk("%s: dev no %d, lun %d, " ++ "newindex %d, oldindex %d " ++ "nn=%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ __func__, dp->dev_id, sap->Lun, ++ bp->NewCurrentPathIndex, orig_id, ++ host->nodename[0], host->nodename[1], ++ host->nodename[2], host->nodename[3], ++ host->nodename[4], host->nodename[5], ++ host->nodename[6], host->nodename[7]);) ++ ++ if (bp->NewCurrentPathIndex != orig_id) { ++ /* Acquire the update spinlock. */ ++ ++ /* Set the new current path. */ ++ new_id = path_list-> current_path[sap->Lun] = ++ bp->NewCurrentPathIndex; ++ ++ /* Release the update spinlock. */ ++ old_path = qla2x00_find_path_by_id( ++ dp, orig_id); ++ new_path = qla2x00_find_path_by_id(dp, new_id); ++ new_host = new_path->host; ++ ++ /* remap the lun */ ++ qla2x00_map_a_oslun(new_host, dp, ++ dp->dev_id, sap->Lun); ++ ++ qla2x00_send_failover_notify(dp, ++ sap->Lun, old_path, new_path); ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: path index not changed.\n", ++ __func__);) ++ } ++ } else { ++ cmd->Status = EXT_STATUS_INVALID_PARAM; ++ cmd->DetailStatus = EXT_DSTATUS_PATH_INDEX; ++ DEBUG4(printk("%s: invalid index for device.\n", ++ __func__);) ++ DEBUG9_10(printk("%s: invalid index for device.\n", ++ __func__);) ++ } ++ } else { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ DEBUG4(printk("%s: cannot find device.\n", ++ __func__);) ++ DEBUG9_10(printk("%s: cannot find device.\n", ++ __func__);) ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ DEBUG9(printk("%s: exiting. rval = %d.\n", __func__, rval);) ++ ++ return rval; ++} ++#endif ++ ++/* ++ * MP SUPPORT ROUTINES ++ */ ++ ++/* ++ * qla2x00_add_mp_host ++ * Add the specified host the host list. ++ * ++ * Input: ++ * node_name = pointer to node name ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_add_mp_host(uint8_t *node_name) ++{ ++ mp_host_t *host, *temp; ++ ++ host = (mp_host_t *) KMEM_ZALLOC(sizeof(mp_host_t), 1); ++ if (host != NULL) { ++ memcpy(host->nodename, node_name, WWN_SIZE); ++ host->next = NULL; ++ /* add to list */ ++ if (mp_hosts_base == NULL) { ++ mp_hosts_base = host; ++ } else { ++ temp = mp_hosts_base; ++ while (temp->next != NULL) ++ temp = temp->next; ++ temp->next = host; ++ } ++ mp_num_hosts++; ++ } ++ return host; ++} ++ ++/* ++ * qla2x00_alloc_host ++ * Allocate and initialize an mp host structure. ++ * ++ * Input: ++ * ha = pointer to base driver's adapter structure. ++ * ++ * Returns: ++ * Pointer to host structure or null on error. ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_alloc_host(scsi_qla_host_t *ha) ++{ ++ mp_host_t *host, *temp; ++ uint8_t *name, *portname; ++ ++ name = &ha->init_cb->node_name[0]; ++ portname = &ha->init_cb->port_name[0]; ++ ++ ENTER("qla2x00_alloc_host"); ++ ++ host = (mp_host_t *) KMEM_ZALLOC(sizeof(mp_host_t), 2); ++ ++ if (host != NULL) { ++ host->ha = ha; ++ memcpy(host->nodename, name, WWN_SIZE); ++ memcpy(host->portname, portname, WWN_SIZE); ++ host->next = NULL; ++ host->flags = MP_HOST_FLAG_NEEDS_UPDATE; ++ host->instance = ha->instance; ++ /* host->MaxLunsPerTarget = qla_fo_params.MaxLunsPerTarget; */ ++ ++ if (qla2x00_fo_enabled(host->ha, host->instance)) { ++ host->flags |= MP_HOST_FLAG_FO_ENABLED; ++ DEBUG4(printk("%s: Failover enabled.\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failover disabled.\n", ++ __func__);) ++ } ++ /* add to list */ ++ if (mp_hosts_base == NULL) { ++ mp_hosts_base = host; ++ } else { ++ temp = mp_hosts_base; ++ while (temp->next != NULL) ++ temp = temp->next; ++ temp->next = host; ++ } ++ mp_num_hosts++; ++ ++ DEBUG4(printk("%s: Alloc host @ %p\n", __func__, host);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed\n", __func__);) ++ } ++ ++ return host; ++} ++ ++/* ++ * qla2x00_add_portname_to_mp_dev ++ * Add the specific port name to the list of port names for a ++ * multi-path device. ++ * ++ * Input: ++ * dp = pointer ti virtual device ++ * portname = Port name to add to device ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_add_portname_to_mp_dev(mp_device_t *dp, uint8_t *portname) ++{ ++ uint8_t index; ++ uint32_t rval = QLA2X00_SUCCESS; ++ ++ ENTER("qla2x00_add_portname_to_mp_dev"); ++ ++ /* Look for an empty slot and add the specified portname. */ ++ for (index = 0; index < MAX_NUMBER_PATHS; index++) { ++ if (qla2x00_is_ww_name_zero(&dp->portnames[index][0])) { ++ DEBUG4(printk("%s: adding portname to dp = " ++ "%p at index = %d\n", ++ __func__, dp, index);) ++ memcpy(&dp->portnames[index][0], portname, WWN_SIZE); ++ break; ++ } ++ } ++ if (index == MAX_NUMBER_PATHS) { ++ rval = QLA2X00_FUNCTION_FAILED; ++ DEBUG4(printk("%s: Fail no room\n", __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Exit OK\n", __func__);) ++ } ++ ++ LEAVE("qla2x00_add_portname_to_mp_dev"); ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2x00_allocate_mp_dev ++ * Allocate an fc_mp_dev, clear the memory, and log a system ++ * error if the allocation fails. After fc_mp_dev is allocated ++ * ++ * Inputs: ++ * nodename = pointer to nodename of new device ++ * portname = pointer to portname of new device ++ * ++ * Returns: ++ * Pointer to new mp_device_t, or NULL if the allocation fails. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_allocate_mp_dev(uint8_t *nodename, uint8_t *portname) ++{ ++ mp_device_t *dp; /* Virtual device pointer */ ++ ++ ENTER("qla2x00_allocate_mp_dev"); ++ ++ dp = (mp_device_t *)KMEM_ZALLOC(sizeof(mp_device_t), 3); ++ ++ if (dp != NULL) { ++ DEBUG3(printk("%s: mp_device_t allocated at %p\n", ++ __func__, dp);) ++ ++ /* ++ * Copy node name into the mp_device_t. ++ */ ++ if (nodename) ++ memcpy(dp->nodename, nodename, WWN_SIZE); ++ ++ /* ++ * Since this is the first port, it goes at ++ * index zero. ++ */ ++ if (portname) ++ memcpy(&dp->portnames[0][0], portname, PORT_NAME_SIZE); ++ ++ /* Allocate an PATH_LIST for the fc_mp_dev. */ ++ if ((dp->path_list = qla2x00_allocate_path_list()) == NULL) { ++ DEBUG4(printk("%s: allocate path_list Failed.\n", ++ __func__);) ++ KMEM_FREE(dp, sizeof(mp_device_t)); ++ dp = NULL; ++ } else { ++ DEBUG4(printk("%s: mp_path_list_t allocated at %p\n", ++ __func__, dp->path_list);) ++ /* EMPTY */ ++ DEBUG4(printk("qla2x00_allocate_mp_dev: Exit Okay\n");) ++ } ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Allocate failed.\n", __func__);) ++ } ++ ++ LEAVE("qla2x00_allocate_mp_dev"); ++ ++ return dp; ++} ++ ++/* ++ * qla2x00_allocate_path ++ * Allocate a PATH. ++ * ++ * Inputs: ++ * host Host adapter for the device. ++ * path_id path number ++ * port port for device. ++ * dev_id device number ++ * ++ * Returns: ++ * Pointer to new PATH, or NULL if the allocation failed. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_allocate_path(mp_host_t *host, uint16_t path_id, ++ fc_port_t *port, uint16_t dev_id) ++{ ++ mp_path_t *path; ++ uint16_t lun; ++ ++ ENTER("qla2x00_allocate_path"); ++ ++ path = (mp_path_t *) KMEM_ZALLOC(sizeof(mp_path_t), 4); ++ if (path != NULL) { ++ DEBUG3(printk("%s: mp_path_t allocated at %p\n", ++ __func__, path); ) ++ ++ /* Copy the supplied information into the MP_PATH. */ ++ path->host = host; ++ if (!(port->flags & FC_CONFIG) || ++ port->loop_id != FC_NO_LOOP_ID) { ++ ++ path->port = port; ++ } ++ path->id = path_id; ++ port->cur_path = path->id; ++ path->mp_byte = port->mp_byte; ++ path->next = NULL; ++ memcpy(path->portname, port->port_name, WWN_SIZE); ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ path->lun_data.data[lun] |= LUN_DATA_ENABLED; ++ } ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed\n", __func__);) ++ } ++ ++ return path; ++} ++ ++ ++/* ++ * qla2x00_allocate_path_list ++ * Allocate a PATH_LIST ++ * ++ * Input: ++ * None ++ * ++ * Returns: ++ * Pointer to new PATH_LIST, or NULL if the allocation fails. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_list_t * ++qla2x00_allocate_path_list( void ) ++{ ++ mp_path_list_t *path_list; ++ uint16_t i; ++ uint8_t l; ++ ++ path_list = (mp_path_list_t *) KMEM_ZALLOC(sizeof(mp_path_list_t), 5); ++ ++ if (path_list != NULL) { ++ DEBUG4(printk("%s: allocated at %p\n", ++ __func__, path_list);) ++ ++ path_list->visible = PATH_INDEX_INVALID; ++ /* Initialized current path */ ++ for (i = 0; i < MAX_LUNS_PER_DEVICE; i++) { ++ l = (uint8_t)(i & 0xFF); ++ path_list->current_path[l] = PATH_INDEX_INVALID; ++ } ++ path_list->last = NULL; ++ ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Alloc pool failed for MP_PATH_LIST.\n", ++ __func__);) ++ } ++ ++ return path_list; ++} ++ ++/* ++ * qla2x00_cfg_find_host ++ * Look through the existing multipath tree, and find ++ * a host adapter to match the specified ha. ++ * ++ * Input: ++ * ha = pointer to host adapter ++ * ++ * Return: ++ * Pointer to new host, or NULL if no match found. ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_cfg_find_host(scsi_qla_host_t *ha) ++{ ++ mp_host_t *host = NULL; /* Host found and null if not */ ++ mp_host_t *tmp_host; ++ ++ ENTER("qla2x00_cfg_find_host"); ++ ++ for (tmp_host = mp_hosts_base; (tmp_host); tmp_host = tmp_host->next) { ++ if (tmp_host->ha == ha) { ++ host = tmp_host; ++ DEBUG3(printk("%s: Found host =%p, instance %d\n", ++ __func__, host, host->instance);) ++ break; ++ } ++ } ++ ++ LEAVE("qla2x00_cfg_find_host"); ++ ++ return host; ++} ++ ++/* ++ * qla2x00_find_host_by_name ++ * Look through the existing multipath tree, and find ++ * a host adapter to match the specified name. ++ * ++ * Input: ++ * name = node name to match. ++ * ++ * Return: ++ * Pointer to new host, or NULL if no match found. ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_find_host_by_name(uint8_t *name) ++{ ++ mp_host_t *host; /* Host found and null if not */ ++ ++ for (host = mp_hosts_base; (host); host = host->next) { ++ if (memcmp(host->nodename, name, WWN_SIZE) == 0) ++ break; ++ } ++ return host; ++} ++ ++ ++/* ++ * qla2x00_find_or_allocate_mp_dev ++ * Look through the existing multipath control tree, and find ++ * an mp_device_t with the supplied world-wide node name. If ++ * one cannot be found, allocate one. ++ * ++ * Input: ++ * host Adapter to add device to. ++ * dev_id Index of device on adapter. ++ * port port database information. ++ * ++ * Returns: ++ * Pointer to new mp_device_t, or NULL if the allocation fails. ++ * ++ * Side Effects: ++ * If the MP HOST does not already point to the mp_device_t, ++ * a pointer is added at the proper port offset. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_find_or_allocate_mp_dev(mp_host_t *host, uint16_t dev_id, ++ fc_port_t *port) ++{ ++ mp_device_t *dp = NULL; /* pointer to multi-path device */ ++ uint8_t node_found; /* Found matching node name. */ ++ uint8_t port_found; /* Found matching port name. */ ++ uint8_t names_valid; /* Node name and port name are not zero */ ++ mp_host_t *temp_host; /* pointer to temporary host */ ++ ++ uint16_t j; ++ mp_device_t *temp_dp; ++ ++ ENTER("qla2x00_find_or_allocate_mp_dev"); ++ ++ DEBUG3(printk("%s: host =%p, port =%p, id = %d\n", ++ __func__, host, port, dev_id);) ++ ++ temp_dp = qla2x00_find_mp_dev_by_id(host,dev_id); ++ ++ DEBUG3(printk("%s: temp dp =%p\n", __func__, temp_dp);) ++ /* if Device already known at this port. */ ++ if (temp_dp != NULL) { ++ node_found = qla2x00_is_nodename_equal(temp_dp->nodename, ++ port->node_name); ++ port_found = qla2x00_is_portname_in_device(temp_dp, ++ port->port_name); ++ ++ if (node_found && port_found) { ++ DEBUG3(printk("%s: port exists in device %p\n", ++ __func__, temp_dp);) ++ dp = temp_dp; ++ ++ /* ++ * Copy the LUN configuration data ++ * into the mp_device_t. ++ */ ++ } ++ } ++ ++ ++ /* Sanity check the port information */ ++ names_valid = (!qla2x00_is_ww_name_zero(port->node_name) && ++ !qla2x00_is_ww_name_zero(port->port_name)); ++ ++ /* ++ * If the optimized check failed, loop through each known ++ * device on each known adapter looking for the node name. ++ */ ++ if (dp == NULL && names_valid) { ++ DEBUG3(printk("%s: Searching each adapter for the device...\n", ++ __func__);) ++ ++ for (temp_host = mp_hosts_base; (temp_host); ++ temp_host = temp_host->next) { ++ ++ /* Loop through each potential device on adapter. */ ++ for (j = 0; j < MAX_MP_DEVICES; j++) { ++ temp_dp = temp_host->mp_devs[j]; ++ ++ if (temp_dp == NULL) ++ continue; ++ ++ node_found = qla2x00_is_nodename_equal( ++ temp_dp->nodename, ++ port->node_name); ++ port_found = qla2x00_is_portname_in_device( ++ temp_dp, ++ port->port_name); ++ ++ if (node_found || port_found) { ++ DEBUG3(printk("%s: Matching device " ++ "found at %p @ %d\n", ++ __func__, temp_dp, j);) ++ /* ++ * If the node name matches but ++ * the port name was not found, ++ * add the port name to the list ++ * of port names. ++ */ ++ if (!port_found) { ++ qla2x00_add_portname_to_mp_dev( ++ temp_dp, ++ port->port_name); ++ } ++ ++ /* ++ * Set the flag that we have ++ * found the device. ++ */ ++ dp = temp_dp; ++ host->mp_devs[j] = dp; ++ dp->use_cnt++; ++ ++ /* Fixme(dg) ++ * Copy the LUN info into ++ * the mp_device_t ++ */ ++ break; ++ } ++ } ++ ++ /* Break outer loop if inner loop succeeded. */ ++ if (dp != NULL) ++ break; ++ } ++ ++ } ++ ++ /* If we couldn't find one, allocate one. */ ++ if (dp == NULL && ++ ((port->flags & FC_CONFIG) || !mp_config_required ) ) { ++ ++ dp = qla2x00_allocate_mp_dev(port->node_name, port->port_name); ++ host->mp_devs[dev_id] = dp; ++ dp->dev_id = dev_id; ++ dp->use_cnt++; ++ } ++ ++ LEAVE("qla2x00_allocate_mp_dev"); ++ ++ return dp; ++} ++ ++ ++/* ++ * qla2x00_find_or_allocate_path ++ * Look through the path list for the supplied device, and either ++ * find the supplied adapter (path) for the adapter, or create ++ * a new one and add it to the path list. ++ * ++ * Input: ++ * host Adapter (path) for the device. ++ * dp Device and path list for the device. ++ * dev_id Index of device on adapter. ++ * port Device data from port database. ++ * ++ * Returns: ++ * Pointer to new PATH, or NULL if the allocation fails. ++ * ++ * Side Effects: ++ * 1. If the PATH_LIST does not already point to the PATH, ++ * a new PATH is added to the PATH_LIST. ++ * 2. If the new path is found to be a second visible path, it is ++ * marked as hidden, and the device database is updated to be ++ * hidden as well, to keep the miniport synchronized. ++ * ++ * Context: ++ * Kernel context. ++ */ ++/* ARGSUSED */ ++static mp_path_t * ++qla2x00_find_or_allocate_path(mp_host_t *host, mp_device_t *dp, ++ uint16_t dev_id, fc_port_t *port) ++{ ++ mp_path_list_t *path_list = dp->path_list; ++ mp_path_t *path; ++ uint8_t id; ++ ++ ++ ENTER("qla2x00_find_or_allocate_path"); ++ ++ DEBUG4(printk("%s: host =%p, port =%p, dp=%p, dev id = %d\n", ++ __func__, host, port, dp, dev_id);) ++ /* ++ * Loop through each known path in the path list. Look for ++ * a PATH that matches both the adapter and the port name. ++ */ ++ path = qla2x00_find_path_by_name(host, path_list, port->port_name); ++ ++ ++ if (path != NULL ) { ++ DEBUG3(printk("%s: Found an existing " ++ "path - host =%p, port =%p, path id = %d\n", ++ __func__, host, path->port, path->id);) ++ DEBUG3(printk("%s: Luns for path_id %d, instance %d\n", ++ __func__, path->id, host->instance);) ++ DEBUG3(qla2x00_dump_buffer( ++ (char *)&path->lun_data.data[0], 64);) ++ ++ /* If we found an existing path, look for any changes to it. */ ++ if (path->port == NULL) { ++ DEBUG3(printk("%s: update path %p, path id= %d, " ++ "mp_byte=0x%x port=%p\n", ++ __func__, path, path->id, ++ path->mp_byte, path->port);) ++ path->port = port; ++ port->mp_byte = path->mp_byte; ++ } else { ++ if ((path->mp_byte & MP_MASK_HIDDEN) && ++ !(port->mp_byte & MP_MASK_HIDDEN)) { ++ ++ DEBUG3(printk("%s: Adapter(%p) " ++ "Device (%p) Path (%d) " ++ "has become visible.\n", ++ __func__, host, dp, path->id);) ++ ++ path->mp_byte &= ~MP_MASK_HIDDEN; ++ } ++ ++ if (!(path->mp_byte & MP_MASK_HIDDEN) && ++ (port->mp_byte & MP_MASK_HIDDEN)) { ++ ++ DEBUG3(printk("%s: Adapter(%p) " ++ "Device (%p) Path (%d) " ++ "has become hidden.\n", ++ __func__, host, dp, path->id);) ++ ++ path->mp_byte |= MP_MASK_HIDDEN; ++ } ++ } ++ ++ } else { ++ /* ++ * If we couldn't find an existing path, and there is still ++ * room to add one, allocate one and put it in the list. ++ */ ++ if (path_list->path_cnt < MAX_PATHS_PER_DEVICE && ++ path_list->path_cnt < qla_fo_params.MaxPathsPerDevice) { ++ ++ id = path_list->path_cnt; ++ ++ /* Update port with bitmask info */ ++ path = qla2x00_allocate_path(host, id, port, dev_id); ++ DEBUG3(printk("%s: new path %p, path id= %d, " ++ "mp_byte=0x%x port=%p\n", ++ __func__, path, id, ++ path->mp_byte, path->port);) ++ qla2x00_add_path(path_list, path); ++ ++ /* Reconcile the new path against the existing ones. */ ++ qla2x00_setup_new_path(dp, path); ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Err exit, no space to add path.\n", ++ __func__);) ++ } ++ ++ } ++ ++ LEAVE("qla2x00_find_or_allocate_path"); ++ ++ return path; ++} ++ ++static uint32_t ++qla2x00_cfg_register_failover_lun(mp_device_t *dp, srb_t *sp, fc_lun_t *new_lp) ++{ ++ uint32_t status = QLA2X00_SUCCESS; ++ os_tgt_t *tq; ++ os_lun_t *lq; ++ fc_lun_t *old_lp; ++ ++ DEBUG2(printk("%s: NEW fclun = %p, sp = %p\n", ++ __func__, new_lp, sp);) ++ ++ /* ++ * Fix lun descriptors to point to new fclun which is a new fcport. ++ */ ++ if (new_lp == NULL) { ++ DEBUG2(printk("%s: Failed new lun %p\n", ++ __func__, new_lp);) ++ return QLA2X00_FUNCTION_FAILED; ++ } ++ ++ tq = sp->tgt_queue; ++ lq = sp->lun_queue; ++ if (tq == NULL) { ++ DEBUG2(printk("%s: Failed to get old tq %p\n", ++ __func__, tq);) ++ return QLA2X00_FUNCTION_FAILED; ++ } ++ if (lq == NULL) { ++ DEBUG2(printk("%s: Failed to get old lq %p\n", ++ __func__, lq);) ++ return QLA2X00_FUNCTION_FAILED; ++ } ++ old_lp = lq->fclun; ++ lq->fclun = new_lp; ++ ++ /* Log the failover to console */ ++ printk(KERN_INFO ++ "qla2x00: FAILOVER device %d from " ++ "%02x%02x%02x%02x%02x%02x%02x%02x -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x - " ++ "LUN %02x, reason=0x%x\n", ++ dp->dev_id, ++ old_lp->fcport->port_name[0], old_lp->fcport->port_name[1], ++ old_lp->fcport->port_name[2], old_lp->fcport->port_name[3], ++ old_lp->fcport->port_name[4], old_lp->fcport->port_name[5], ++ old_lp->fcport->port_name[6], old_lp->fcport->port_name[7], ++ new_lp->fcport->port_name[0], new_lp->fcport->port_name[1], ++ new_lp->fcport->port_name[2], new_lp->fcport->port_name[3], ++ new_lp->fcport->port_name[4], new_lp->fcport->port_name[5], ++ new_lp->fcport->port_name[6], new_lp->fcport->port_name[7], ++ new_lp->lun, sp->err_id); ++ printk(KERN_INFO ++ "qla2x00: FROM HBA %d to HBA %d\n", ++ (int)old_lp->fcport->ha->instance, ++ (int)new_lp->fcport->ha->instance); ++ ++ DEBUG3(printk("%s: NEW fclun = %p , port =%p, " ++ "loop_id =0x%x, instance %ld\n", ++ __func__, ++ new_lp, new_lp->fcport, ++ new_lp->fcport->loop_id, ++ new_lp->fcport->ha->instance);) ++ ++ return status; ++} ++ ++ ++/* ++ * qla2x00_send_failover_notify ++ * A failover operation has just been done from an old path ++ * index to a new index. Call lower level driver ++ * to perform the failover notification. ++ * ++ * Inputs: ++ * device Device being failed over. ++ * lun LUN being failed over. ++ * newpath path that was failed over too. ++ * oldpath path that was failed over from. ++ * ++ * Return: ++ * Local function status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++/* ARGSUSED */ ++static uint32_t ++qla2x00_send_failover_notify(mp_device_t *dp, ++ uint8_t lun, mp_path_t *newpath, mp_path_t *oldpath) ++{ ++ fc_lun_t *old_lp, *new_lp; ++ uint32_t status = QLA2X00_SUCCESS; ++ ++ ENTER("qla2x00_send_failover_notify"); ++ ++ old_lp = qla2x00_find_matching_lun(lun, oldpath); ++ new_lp = qla2x00_find_matching_lun(lun, newpath); ++ ++ /* ++ * If the target is the same target, but a new HBA has been selected, ++ * send a third party logout if required. ++ */ ++ if ((qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET || ++ qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LOGOUT_OR_CDB) && ++ qla2x00_is_portname_equal( ++ oldpath->portname, newpath->portname)) { ++ ++ status = qla2x00_send_fo_notification(old_lp, new_lp); ++ if (status == QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Logout succeded\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Logout Failed\n", ++ __func__);) ++ } ++ } else if ((qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LUN_RESET) || ++ (qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET)) { ++ ++ /* ++ * If desired, send a LUN reset as the ++ * failover notification type. ++ */ ++ if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) { ++ status = qla2x00_send_fo_notification(old_lp, new_lp); ++ if (status == QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: LUN reset succeeded.\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed reset LUN.\n", ++ __func__);) ++ } ++ } ++ ++ } else if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB || ++ qla_fo_params.FailoverNotifyType == ++ FO_NOTIFY_TYPE_LOGOUT_OR_CDB) { ++ ++ if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) { ++ status = qla2x00_send_fo_notification(old_lp, new_lp); ++ if (status == QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Send CDB succeeded.\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Send CDB Error " ++ "lun=(%d).\n", __func__, lun);) ++ } ++ } ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: failover disabled or no notify routine " ++ "defined.\n", __func__);) ++ } ++ ++ return status; ++} ++ ++/* ++ * qla2x00_select_next_path ++ * A problem has been detected with the current path for this ++ * device. Try to select the next available path as the current ++ * path for this device. If there are no more paths, the same ++ * path will still be selected. ++ * ++ * Inputs: ++ * dp pointer of device structure. ++ * lun LUN to failover. ++ * ++ * Return Value: ++ * new path or same path ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_select_next_path(mp_host_t *host, mp_device_t *dp, uint8_t lun) ++{ ++ mp_path_t *path = NULL; ++ mp_path_list_t *path_list; ++ mp_path_t *orig_path; ++ int id; ++ uint32_t status; ++ mp_host_t *new_host; ++ ++ ENTER("qla2x00_select_next_path:"); ++ ++ path_list = dp->path_list; ++ if (path_list == NULL) ++ return NULL; ++ ++ /* Get current path */ ++ id = path_list->current_path[lun]; ++ ++ /* Get path for current path id */ ++ if ((orig_path = qla2x00_find_path_by_id(dp, id)) != NULL) { ++ ++ /* select next path */ ++ path = orig_path->next; ++ new_host = path->host; ++ ++ /* FIXME may need to check for HBA being reset */ ++ DEBUG3(printk("%s: orig path = %p new path = %p " ++ "curr idx = %d, new idx = %d\n", ++ __func__, orig_path, path, orig_path->id, path->id);) ++ DEBUG3(printk(" FAILOVER: device nodename: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ dp->nodename[0], dp->nodename[1], ++ dp->nodename[2], dp->nodename[3], ++ dp->nodename[4], dp->nodename[5], ++ dp->nodename[6], dp->nodename[7]);) ++ DEBUG3(printk(" Original - host nodename: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ orig_path->host->nodename[0], ++ orig_path->host->nodename[1], ++ orig_path->host->nodename[2], ++ orig_path->host->nodename[3], ++ orig_path->host->nodename[4], ++ orig_path->host->nodename[5], ++ orig_path->host->nodename[6], ++ orig_path->host->nodename[7]);) ++ DEBUG3(printk(" portname: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ orig_path->port->port_name[0], ++ orig_path->port->port_name[1], ++ orig_path->port->port_name[2], ++ orig_path->port->port_name[3], ++ orig_path->port->port_name[4], ++ orig_path->port->port_name[5], ++ orig_path->port->port_name[6], ++ orig_path->port->port_name[7]);) ++ DEBUG3(printk(" New - host nodename: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ new_host->nodename[0], new_host->nodename[1], ++ new_host->nodename[2], new_host->nodename[3], ++ new_host->nodename[4], new_host->nodename[5], ++ new_host->nodename[6], new_host->nodename[7]);) ++ DEBUG3(printk(" portname: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ path->port->port_name[0], ++ path->port->port_name[1], ++ path->port->port_name[2], ++ path->port->port_name[3], ++ path->port->port_name[4], ++ path->port->port_name[5], ++ path->port->port_name[6], ++ path->port->port_name[7]);) ++ ++ path_list->current_path[lun] = path->id; ++ ++ /* If we selected a new path, do failover notification. */ ++ if (path != orig_path) { ++ status = qla2x00_send_failover_notify( ++ dp, lun, path, orig_path); ++ ++ /* ++ * Currently we ignore the returned status from ++ * the notify. however, if failover notify fails ++ */ ++ } ++ } ++ ++ LEAVE("qla2x00_select_next_path:"); ++ ++ return path ; ++} ++ ++ ++ ++/* ++ * qla2x00_update_mp_host ++ * Update the multipath control information from the port ++ * database for that adapter. ++ * ++ * Input: ++ * host Adapter to update. Devices that are new are ++ * known to be attached to this adapter. ++ * ++ * Returns: ++ * TRUE if updated successfully; FALSE if error. ++ * ++ */ ++static uint8_t ++qla2x00_update_mp_host(mp_host_t *host) ++{ ++ uint8_t success = TRUE; ++ uint16_t dev_id; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ scsi_qla_host_t *ha = host->ha; ++ ++ ENTER("qla2x00_update_mp_host"); ++ ++ /* ++ * We make sure each port is attached to some virtual device. ++ */ ++ dev_id = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ success |= qla2x00_update_mp_device(host, fcport, dev_id); ++ ++ dev_id++; ++ } ++ if (success) { ++ DEBUG2(printk("%s: Exit OK\n", __func__);) ++ qla2x00_map_os_targets(host); ++ } else { ++ /* EMPTY */ ++ DEBUG2(printk("%s: Exit FAILED\n", __func__);) ++ } ++ ++ LEAVE("qla2x00_update_mp_host"); ++ ++ return success; ++} ++ ++/* ++ * qla2x00_update_mp_device ++ * Update the multipath control information from the port ++ * database for that adapter. ++ * ++ * Inputs: ++ * host Host adapter structure ++ * port Device to add to the path tree. ++ * dev_id Device id ++ * ++ * Synchronization: ++ * The Adapter Lock should have already been acquired ++ * before calling this routine. ++ * ++ * Return ++ * TRUE if updated successfully; FALSE if error. ++ * ++ */ ++uint8_t ++qla2x00_update_mp_device(mp_host_t *host, fc_port_t *port, uint16_t dev_id) ++{ ++ uint8_t success = TRUE; ++ mp_device_t *dp; ++ mp_path_t *path; ++ ++ ENTER("qla2x00_update_mp_device"); ++ ++ DEBUG3(printk("%s: host =%p, port =%p, id = %d\n", ++ __func__, host, port, dev_id);) ++ ++ if (!qla2x00_is_ww_name_zero(port->port_name)) { ++ ++ /* ++ * Search for a device with a matching node name, ++ * or create one. ++ */ ++ dp = qla2x00_find_or_allocate_mp_dev(host, dev_id, port); ++ ++ /* ++ * We either have found or created a path list. Find this ++ * host's path in the path list or allocate a new one ++ * and add it to the list. ++ */ ++ if (dp == NULL) { ++ DEBUG4(printk("%s: Device NOT found or created at.\n", ++ __func__);) ++ return FALSE; ++ } ++ ++ /* ++ * Find the path in the current path list, or allocate ++ * a new one and put it in the list if it doesn't exist. ++ * Note that we do NOT set bSuccess to FALSE in the case ++ * of failure here. We must tolerate the situation where ++ * the customer has more paths to a device than he can ++ * get into a PATH_LIST. ++ */ ++ ++ path = qla2x00_find_or_allocate_path(host, dp, dev_id, port); ++ if (path == NULL) { ++ DEBUG4(printk("%s:Path NOT found or created.\n", ++ __func__);) ++ return FALSE; ++ } ++ ++ /* Set the PATH flag to match the device flag ++ * of whether this device needs a relogin. If any ++ * device needs relogin, set the relogin countdown. ++ */ ++ if (port->flags & FC_CONFIG) ++ path->config = TRUE; ++ ++ if (atomic_read(&port->state) != FC_ONLINE) { ++ path->relogin = TRUE; ++ if (host->relogin_countdown == 0) ++ host->relogin_countdown = 30; ++ } else { ++ path->relogin = FALSE; ++ } ++ ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed portname empty.\n", ++ __func__);) ++ } ++ ++ LEAVE("qla2x00_update_mp_device"); ++ ++ return success; ++} ++ ++/* ++ * qla2x00_update_mp_tree ++ * Get port information from each adapter, and build or rebuild ++ * the multipath control tree from this data. This is called ++ * from init and during port database notification. ++ * ++ * Input: ++ * None ++ * ++ * Return: ++ * Local function return code. ++ * ++ */ ++static uint32_t ++qla2x00_update_mp_tree(void) ++{ ++ mp_host_t *host; ++ uint32_t rval = QLA2X00_SUCCESS; ++ ++ ENTER("qla2x00_update_mp_tree:"); ++ ++ /* Loop through each adapter and see what needs updating. */ ++ for (host = mp_hosts_base; (host) ; host = host->next) { ++ ++ DEBUG4(printk("%s: hba(%d) flags (%x)\n", ++ __func__, host->instance, host->flags);) ++ /* Clear the countdown; it may be reset in the update. */ ++ host->relogin_countdown = 0; ++ ++ /* Override the NEEDS_UPDATE flag if disabled. */ ++ if (host->flags & MP_HOST_FLAG_DISABLE || ++ list_empty(host->fcports)) ++ host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE; ++ ++ if (host->flags & MP_HOST_FLAG_NEEDS_UPDATE) { ++ ++ /* ++ * Perform the actual updates. If this succeeds, clear ++ * the flag that an update is needed, and failback all ++ * devices that are visible on this path to use this ++ * path. If the update fails, leave set the flag that ++ * an update is needed, and it will be picked back up ++ * during the next timer routine. ++ */ ++ if (qla2x00_update_mp_host(host)) { ++ host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE; ++ ++ qla2x00_failback_luns(host); ++ } else ++ rval = QLA2X00_FUNCTION_FAILED; ++ ++ } ++ ++ } ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Exit FAILED.\n", __func__);) ++ ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Exit OK.\n", __func__);) ++ } ++ return rval; ++} ++ ++ ++ ++/* ++ * qla2x00_find_matching_lun ++ * Find the lun in the path that matches the ++ * specified lun number. ++ * ++ * Input: ++ * lun = lun number ++ * newpath = path to search for lun ++ * ++ * Returns: ++ * NULL or pointer to lun ++ * ++ * Context: ++ * Kernel context. ++ * (dg) ++ */ ++static fc_lun_t * ++qla2x00_find_matching_lun(uint8_t lun, mp_path_t *newpath) ++{ ++ fc_lun_t *lp = NULL; /* lun ptr */ ++ struct list_head *fcll; ++ fc_lun_t *nlp; /* Next lun ptr */ ++ fc_port_t *fcport; /* port ptr */ ++ ++ if ((fcport = newpath->port) != NULL) { ++ list_for_each(fcll, &fcport->fcluns) { ++ nlp = list_entry(fcll, fc_lun_t, list); ++ ++ if (lun == nlp->lun) { ++ lp = nlp; ++ break; ++ } ++ } ++ } ++ return lp; ++} ++ ++/* ++ * qla2x00_find_path_by_name ++ * Find the path specified portname from the pathlist ++ * ++ * Input: ++ * host = host adapter pointer. ++ * pathlist = multi-path path list ++ * portname portname to search for ++ * ++ * Returns: ++ * pointer to the path or NULL ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_path_t * ++qla2x00_find_path_by_name(mp_host_t *host, mp_path_list_t *plp, ++ uint8_t *portname) ++{ ++ mp_path_t *path = NULL; /* match if not NULL */ ++ mp_path_t *tmp_path; ++ int cnt; ++ ++ if ((tmp_path = plp->last) != NULL) { ++ for (cnt = 0; cnt < plp->path_cnt; cnt++) { ++ if (tmp_path->host == host && ++ qla2x00_is_portname_equal( ++ tmp_path->portname, portname)) { ++ ++ path = tmp_path; ++ break; ++ } ++ tmp_path = tmp_path->next; ++ } ++ } ++ return path ; ++} ++ ++/* ++ * qla2x00_find_path_by_id ++ * Find the path for the specified path id. ++ * ++ * Input: ++ * dp multi-path device ++ * id path id ++ * ++ * Returns: ++ * pointer to the path or NULL ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_find_path_by_id(mp_device_t *dp, uint8_t id) ++{ ++ mp_path_t *path = NULL; ++ mp_path_t *tmp_path; ++ mp_path_list_t *path_list; ++ int cnt; ++ ++ path_list = dp->path_list; ++ tmp_path = path_list->last; ++ for (cnt = 0; (tmp_path) && cnt < path_list->path_cnt; cnt++) { ++ if (tmp_path->id == id) { ++ path = tmp_path; ++ break; ++ } ++ tmp_path = tmp_path->next; ++ } ++ return path ; ++} ++ ++/* ++ * qla2x00_find_mp_dev_by_id ++ * Find the mp_dev for the specified target id. ++ * ++ * Input: ++ * host = host adapter pointer. ++ * tgt = Target id ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_find_mp_dev_by_id(mp_host_t *host, uint8_t id ) ++{ ++ if (id < MAX_MP_DEVICES) ++ return host->mp_devs[id]; ++ else ++ return NULL; ++} ++ ++/* ++ * qla2x00_find_mp_dev_by_name ++ * Find the mp_dev for the specified target name. ++ * ++ * Input: ++ * host = host adapter pointer. ++ * name = Target name ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_find_mp_dev_by_name(mp_host_t *host, uint8_t *name ) ++{ ++ int id; ++ mp_device_t *dp; ++ ++ ENTER("qla2x00_find_mp_dev_by_name"); ++ ++ for (id= 0; id < MAX_MP_DEVICES; id++) { ++ if ((dp = host->mp_devs[id] ) == NULL) ++ continue; ++ ++ if (qla2x00_is_nodename_equal(dp->nodename, name)) { ++ DEBUG3(printk("%s: Found matching device @ index %d:\n", ++ __func__, id);) ++ return dp; ++ } ++ } ++ ++ LEAVE("qla2x00_find_mp_dev_by_name"); ++ ++ return NULL; ++} ++ ++/* ++ * qla2x00_get_visible_path ++ * Find the the visible path for the specified device. ++ * ++ * Input: ++ * dp = device pointer ++ * ++ * Returns: ++ * NULL or path ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_get_visible_path(mp_device_t *dp) ++{ ++ uint16_t id; ++ mp_path_list_t *path_list; ++ mp_path_t *path; ++ ++ path_list = dp->path_list; ++ /* if we don't have a visible path skip it */ ++ if ((id = path_list->visible) == PATH_INDEX_INVALID) { ++ return NULL; ++ } ++ ++ if ((path = qla2x00_find_path_by_id(dp,id))== NULL) ++ return NULL; ++ ++ return path ; ++} ++ ++/* ++ * qla2x00_map_os_targets ++ * Allocate the luns and setup the OS target. ++ * ++ * Input: ++ * host = host adapter pointer. ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_map_os_targets(mp_host_t *host) ++{ ++ scsi_qla_host_t *ha = host->ha; ++ mp_path_t *path; ++ mp_device_t *dp; ++ os_tgt_t *tgt; ++ int t; ++ ++ ENTER("qla2x00_map_os_targets "); ++ ++ for (t = 0; t < MAX_TARGETS; t++ ) { ++ dp = host->mp_devs[t]; ++ if (dp != NULL) { ++ DEBUG3(printk("%s: (%d) found a dp=%p, " ++ "host=%p, ha=%p\n", ++ __func__, t, dp, host,ha);) ++ ++ if ((path = qla2x00_get_visible_path(dp)) == NULL) { ++ printk(KERN_INFO ++ "qla_cfg(%d): No visible path " ++ "for target %d, dp = %p\n", ++ host->instance, t, dp); ++ continue; ++ } ++ ++ /* if not the visible path skip it */ ++ if (path->host == host) { ++ if (TGT_Q(ha, t) == NULL) { ++ tgt = qla2x00_tgt_alloc(ha, t); ++ memcpy(tgt->node_name, ++ dp->nodename, ++ WWN_SIZE); ++ tgt->vis_port = path->port; ++ } ++ DEBUG3(printk("%s(%ld): host=%d, " ++ "device= %p has VISIBLE " ++ "path=%p, path id=%d\n", ++ __func__, ha->host_no, ++ host->instance, ++ dp, path, path->id);) ++ } else { ++ /* EMPTY */ ++ DEBUG3(printk("%s(%ld): host=%d, " ++ "device= %p has HIDDEN " ++ "path=%p, path id=%d\n", ++ __func__, ha->host_no, ++ host->instance, dp, path,path->id);) ++ } ++ qla2x00_map_os_luns(host, dp, t); ++ } else { ++ if ((tgt= TGT_Q(ha,t)) != NULL) { ++ qla2x00_tgt_free(ha,t); ++ } ++ } ++ } ++ ++ LEAVE("qla2x00_map_os_targets "); ++} ++ ++/* ++ * qla2x00_map_os_luns ++ * Allocate the luns for the OS target. ++ * ++ * Input: ++ * dp = pointer to device ++ * t = OS target number. ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_map_os_luns(mp_host_t *host, mp_device_t *dp, uint16_t t) ++{ ++ uint16_t lun; ++ int i; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++ ) { ++ if ( qla2x00_map_a_oslun(host, dp, t, lun) && ++ (host->flags & MP_HOST_FLAG_LUN_FO_ENABLED) ){ ++ /* find a path for us to use */ ++ for ( i = 0; i < dp->path_list->path_cnt; i++ ){ ++ qla2x00_select_next_path(host, dp, lun); ++ if( !qla2x00_map_a_oslun(host, dp, t, lun)) ++ break; ++ } ++ } ++ } ++} ++ ++/* ++ * qla2x00_map_a_osluns ++ * Map the OS lun to the current path ++ * ++ * Input: ++ * host = pointer to host ++ * dp = pointer to device ++ * lun = OS lun number. ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++ ++static uint8_t ++qla2x00_map_a_oslun(mp_host_t *host, mp_device_t *dp, uint16_t t, uint16_t lun) ++{ ++ fc_port_t *fcport; ++ fc_lun_t *fclun; ++ os_lun_t *lq; ++ uint16_t id; ++ mp_path_t *path, *vis_path; ++ mp_host_t *vis_host; ++ uint8_t status = FALSE; ++ ++ if ((id = dp->path_list->current_path[lun]) != PATH_INDEX_INVALID) { ++ path = qla2x00_find_path_by_id(dp,id); ++ if (path) { ++ fcport = path->port; ++ if (fcport) { ++ /* dg 04/26/02 */ ++ fcport->cur_path = id; ++ fclun = qla2x00_find_matching_lun(lun,path); ++ ++ /* Always map all luns if they are enabled */ ++ if (fclun && ++ (path->lun_data.data[lun] & ++ LUN_DATA_ENABLED) ) { ++ ++ /* ++ * Mapped lun on the visible path ++ */ ++ if ((vis_path = ++ qla2x00_get_visible_path(dp)) == ++ NULL ) { ++ ++ printk(KERN_INFO ++ "qla2x00(%d): No visible " ++ "path for target %d, " ++ "dp = %p\n", ++ host->instance, ++ t, dp); ++ ++ return FALSE; ++ } ++ ++ vis_host = vis_path->host; ++ ++ /* ra 11/30/01 */ ++ /* ++ * Always alloc LUN 0 so kernel ++ * will scan past LUN 0. ++ */ ++ if (lun != 0 && ++ (EXT_IS_LUN_BIT_SET( ++ &(fcport->lun_mask), lun))) { ++ ++ /* mask this LUN */ ++ return FALSE; ++ } ++ ++ if ((lq = qla2x00_lun_alloc( ++ vis_host->ha, ++ t, lun)) != NULL) { ++ ++ lq->fclun = fclun; ++ } ++ } ++ } ++ else ++ status = TRUE; ++ } ++ } ++ return status; ++} ++ ++/* ++ * qla2x00_is_ww_name_zero ++ * ++ * Input: ++ * ww_name = Pointer to WW name to check ++ * ++ * Returns: ++ * TRUE if name is 0 else FALSE ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_is_ww_name_zero(uint8_t *nn) ++{ ++ int cnt; ++ ++ /* Check for zero node name */ ++ for (cnt = 0; cnt < WWN_SIZE ; cnt++, nn++) { ++ if (*nn != 0) ++ break; ++ } ++ /* if zero return TRUE */ ++ if (cnt == WWN_SIZE) ++ return TRUE; ++ else ++ return FALSE; ++} ++ ++/* ++ * qla2x00_add_path ++ * Add a path to the pathlist ++ * ++ * Input: ++ * pathlist -- path list of paths ++ * path -- path to be added to list ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_add_path( mp_path_list_t *pathlist, mp_path_t *path ) ++{ ++ mp_path_t *last = pathlist->last; ++ ++ ENTER("qla2x00_add_path"); ++ ++ DEBUG3(printk("%s: pathlist =%p, path =%p, cnt = %d\n", ++ __func__, pathlist, path, pathlist->path_cnt);) ++ if (last == NULL) { ++ last = path; ++ } else { ++ path->next = last->next; ++ } ++ ++ last->next = path; ++ pathlist->last = path; ++ pathlist->path_cnt++; ++ ++ LEAVE("qla2x00_add_path"); ++} ++ ++ ++/* ++ * qla2x00_is_portname_in_device ++ * Search for the specified "portname" in the device list. ++ * ++ * Input: ++ * dp = device pointer ++ * portname = portname to searched for in device ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint8_t ++qla2x00_is_portname_in_device(mp_device_t *dp, uint8_t *portname) ++{ ++ int idx; ++ ++ for (idx = 0; idx < MAX_PATHS_PER_DEVICE; idx++) { ++ if (memcmp(&dp->portnames[idx][0], portname, WWN_SIZE) == 0) ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++ ++/* ++ * qla2x00_set_lun_data_from_bitmask ++ * Set or clear the LUN_DATA_ENABLED bits in the LUN_DATA from ++ * a LUN bitmask provided from the miniport driver. ++ * ++ * Inputs: ++ * lun_data = Extended LUN_DATA buffer to set. ++ * lun_mask = Pointer to lun bit mask union. ++ * ++ * Return Value: none. ++ */ ++void ++qla2x00_set_lun_data_from_bitmask(mp_lun_data_t *lun_data, ++ lun_bit_mask_t *lun_mask) ++{ ++ int16_t lun; ++ ++ ENTER("qla2x00_set_lun_data_from_bitmask"); ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ /* our bit mask is inverted */ ++ if (!(EXT_IS_LUN_BIT_SET(lun_mask,lun))) ++ lun_data->data[lun] |= LUN_DATA_ENABLED; ++ else ++ lun_data->data[lun] &= ~LUN_DATA_ENABLED; ++ ++ DEBUG5(printk("%s: lun data[%d] = 0x%x\n", ++ __func__, lun, lun_data->data[lun]);) ++ } ++ ++ LEAVE("qla2x00_set_lun_data_from_bitmask"); ++ ++ return; ++} ++ ++static void ++qla2x00_failback_single_lun(mp_device_t *dp, uint8_t lun, uint8_t new) ++{ ++ mp_path_list_t *pathlist; ++ mp_path_t *new_path, *old_path; ++ uint8_t old; ++ mp_host_t *host; ++ os_lun_t *lq; ++ mp_path_t *vis_path; ++ mp_host_t *vis_host; ++ ++ /* Failback and update statistics. */ ++ if ((pathlist = dp->path_list) == NULL) ++ return; ++ ++ old = pathlist->current_path[lun]; ++ pathlist->current_path[lun] = new; ++ ++ if ((new_path = qla2x00_find_path_by_id(dp, new)) == NULL) ++ return; ++ if ((old_path = qla2x00_find_path_by_id(dp, old)) == NULL) ++ return; ++ ++ /* An fclun should exist for the failbacked lun */ ++ if (qla2x00_find_matching_lun(lun, new_path) == NULL) ++ return; ++ if (qla2x00_find_matching_lun(lun, old_path) == NULL) ++ return; ++ ++ /* Log to console and to event log. */ ++ printk(KERN_INFO ++ "qla2x00: FAILBACK device %d -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x LUN %02x\n", ++ dp->dev_id, ++ dp->nodename[0], dp->nodename[1], ++ dp->nodename[2], dp->nodename[3], ++ dp->nodename[4], dp->nodename[5], ++ dp->nodename[6], dp->nodename[7], ++ lun); ++ ++ printk(KERN_INFO ++ "qla2x00: FROM HBA %d to HBA %d \n", ++ old_path->host->instance, ++ new_path->host->instance); ++ ++ ++ /* Send a failover notification. */ ++#if 0 ++ qla2x00_send_failover_notify(dp, lun, new_path, old_path); ++#endif ++ ++ host = new_path->host; ++ ++ /* remap the lun */ ++ qla2x00_map_a_oslun(host, dp, dp->dev_id, lun); ++ ++ /* 7/16 ++ * Reset counts on the visible path ++ */ ++ if ((vis_path = qla2x00_get_visible_path(dp)) == NULL) { ++ printk(KERN_INFO ++ "qla2x00(%d): No visible path for " ++ "target %d, dp = %p\n", ++ host->instance, ++ dp->dev_id, dp); ++ return; ++ } ++ ++ vis_host = vis_path->host; ++ if ((lq = qla2x00_lun_alloc(vis_host->ha, dp->dev_id, lun)) != NULL) { ++ qla2x00_delay_lun(vis_host->ha, lq, recoveryTime); ++ qla2x00_flush_failover_q(vis_host->ha, lq); ++ qla2x00_reset_lun_fo_counts(vis_host->ha, lq); ++ } ++} ++ ++/* ++* qla2x00_failback_luns ++* This routine looks through the devices on an adapter, and ++* for each device that has this adapter as the visible path, ++* it forces that path to be the current path. This allows us ++* to keep some semblance of static load balancing even after ++* an adapter goes away and comes back. ++* ++* Arguments: ++* host Adapter that has just come back online. ++* ++* Return: ++* None. ++*/ ++static void ++qla2x00_failback_luns( mp_host_t *host) ++{ ++ uint16_t dev_no; ++ uint8_t l; ++ uint16_t lun; ++ int i; ++ mp_device_t *dp; ++ mp_path_list_t *path_list; ++ mp_path_t *path; ++ fc_lun_t *new_fp; ++ ++ ENTER("qla2x00_failback_luns"); ++ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ path_list = dp->path_list; ++ for (path = path_list->last, i= 0; ++ i < path_list->path_cnt; ++ i++, path = path->next) { ++ ++ if (path->host != host ) ++ continue; ++ ++ if (path->port == NULL) ++ continue; ++ ++ if (atomic_read(&path->port->state) == FC_DEVICE_DEAD) ++ continue; ++ ++ /* ++ * Failback all the paths for this host, ++ * the luns could be preferred across all paths ++ */ ++ DEBUG2(printk("%s(%d): Lun Data for device %p, " ++ "id=%d, path id=%d\n", ++ __func__, host->instance, dp, dp->dev_id, ++ path->id);) ++ DEBUG4(qla2x00_dump_buffer( ++ (char *)&path->lun_data.data[0], 64);) ++ DEBUG4(printk("%s(%d): Perferrred Path data:\n", ++ __func__, host->instance);) ++ DEBUG4(qla2x00_dump_buffer( ++ (char *)&path_list->current_path[0], 64);) ++ ++ for (lun = 0; lun < MAX_LUNS_PER_DEVICE; lun++) { ++ l = (uint8_t)(lun & 0xFF); ++ ++ /* ++ * if this is the preferred lun and not ++ * the current path then failback lun. ++ */ ++ DEBUG4(printk("%s: target=%d, cur path id =%d, " ++ "lun data[%d] = %d)\n", ++ __func__, dp->dev_id, path->id, ++ lun, path->lun_data.data[lun]);) ++ ++ if ((path->lun_data.data[l] & ++ LUN_DATA_PREFERRED_PATH) && ++ /* !path->relogin && */ ++ path_list->current_path[l] != ++ path->id) { ++ /* No point in failing back a ++ disconnected lun */ ++ new_fp = qla2x00_find_matching_lun( ++ l, path); ++ ++ if (new_fp == NULL) ++ continue; ++ if (new_fp->flags & FC_DISCON_LUN) ++ continue; ++ ++ qla2x00_failback_single_lun( ++ dp, l, path->id); ++ } ++ } ++ } ++ ++ } ++ ++ LEAVE("qla2x00_failback_luns"); ++ ++ return; ++} ++ ++/* ++ * qla2x00_setup_new_path ++ * Checks the path against the existing paths to see if there ++ * are any incompatibilities. It then checks and sets up the ++ * current path indices. ++ * ++ * Inputs: ++ * dp = pointer to device ++ * path = new path ++ * ++ * Returns: ++ * None ++ */ ++static void ++qla2x00_setup_new_path( mp_device_t *dp, mp_path_t *path) ++{ ++ mp_path_list_t *path_list = dp->path_list; ++ mp_path_t *tmp_path, *first_path; ++ mp_host_t *first_host; ++ mp_host_t *tmp_host; ++ ++ uint16_t lun; ++ uint8_t l; ++ int i; ++ ++ ENTER("qla2x00_setup_new_path"); ++ ++ /* If this is a visible path, and there is not already a ++ * visible path, save it as the visible path. If there ++ * is already a visible path, log an error and make this ++ * path invisible. ++ */ ++ if (!(path->mp_byte & (MP_MASK_HIDDEN | MP_MASK_UNCONFIGURED))) { ++ ++ /* No known visible path */ ++ if (path_list->visible == PATH_INDEX_INVALID) { ++ DEBUG3(printk("%s: No know visible path - make this " ++ "path visible\n", ++ __func__);) ++ ++ path_list->visible = path->id; ++ path->mp_byte &= ~MP_MASK_HIDDEN; ++ } else { ++ DEBUG3(printk("%s: Second visible path found- make " ++ "this one hidden\n", ++ __func__);) ++ ++ path->mp_byte |= MP_MASK_HIDDEN; ++ } ++ } ++ ++ /* ++ * If this is not the first path added, and the setting for ++ * MaxLunsPerTarget does not match that of the first path ++ * then disable qla_cfg for all adapters. ++ */ ++ first_path = qla2x00_find_path_by_id(dp, 0); ++ ++ if (first_path != NULL) { ++ first_host = first_path->host; ++ if ((path->id != 0) && ++ (first_host->MaxLunsPerTarget != ++ path->host->MaxLunsPerTarget)) { ++ ++ for (tmp_path = path_list->last, i = 0; ++ (tmp_path) && i <= path->id; i++) { ++ ++ tmp_host = tmp_path->host; ++ if (!(tmp_host->flags & ++ MP_HOST_FLAG_DISABLE)) { ++ ++ DEBUG4(printk("%s: 2nd visible " ++ "path (%p)\n", ++ __func__, tmp_host);) ++ ++ tmp_host->flags |= MP_HOST_FLAG_DISABLE; ++ } ++ } ++ } ++ } ++ ++ /* ++ * For each LUN, evaluate whether the new path that is added ++ * is better than the existing path. If it is, make it the ++ * current path for the LUN. ++ */ ++ for (lun = 0; lun < MAX_LUNS_PER_DEVICE; lun++) { ++ l = (uint8_t)(lun & 0xFF); ++ ++ /* If this is the first path added, it is the only ++ * available path, so make it the current path. ++ */ ++ ++ DEBUG4(printk("%s: lun_data 0x%x, LUN %d\n", ++ __func__, path->lun_data.data[l], lun);) ++ ++ if (first_path == path) { ++ path_list->current_path[l] = 0; ++ path->lun_data.data[l] |= LUN_DATA_PREFERRED_PATH; ++ } else if (path->lun_data.data[l] & LUN_DATA_PREFERRED_PATH) { ++ /* ++ * If this is not the first path added, if this is ++ * the preferred path, make it the current path. ++ */ ++ path_list->current_path[l] = path->id; ++ } ++ } ++ ++ LEAVE("qla2x00_setup_new_path"); ++ ++ return; ++} ++ ++/* ++ * qla2x00_cfg_mem_free ++ * Free all configuration structures. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_cfg_mem_free(scsi_qla_host_t *ha) ++{ ++ mp_device_t *dp; ++ mp_path_list_t *path_list; ++ mp_path_t *tmp_path, *path; ++ mp_host_t *host, *temp; ++ int id, cnt; ++ ++ if ((host = qla2x00_cfg_find_host(ha)) != NULL) { ++ if( mp_num_hosts == 0 ) ++ return; ++ ++ for (id= 0; id < MAX_MP_DEVICES; id++) { ++ if ((dp = host->mp_devs[id]) == NULL) ++ continue; ++ if ((path_list = dp->path_list) == NULL) ++ continue; ++ if ((tmp_path = path_list->last) == NULL) ++ continue; ++ for (cnt = 0; cnt < path_list->path_cnt; cnt++) { ++ path = tmp_path; ++ tmp_path = tmp_path->next; ++ DEBUG(printk(KERN_INFO ++ "host%d - Removing path[%d] " ++ "= %p\n", ++ host->instance, ++ cnt, path);) ++ KMEM_FREE(path,sizeof(mp_path_t)); ++ } ++ KMEM_FREE(path_list, sizeof(mp_path_list_t)); ++ host->mp_devs[id] = NULL; ++ /* remove dp from other hosts */ ++ for (temp = mp_hosts_base; (temp); temp = temp->next) { ++ if (temp->mp_devs[id] == dp) { ++ DEBUG(printk(KERN_INFO ++ "host%d - Removing host[%d] = " ++ "%p\n", ++ host->instance, ++ temp->instance,temp);) ++ temp->mp_devs[id] = NULL; ++ } ++ } ++ KMEM_FREE(dp, sizeof(mp_device_t)); ++ } ++ ++ /* remove this host from host list */ ++ temp = mp_hosts_base; ++ if (temp != NULL) { ++ /* Remove from top of queue */ ++ if (temp == host) { ++ mp_hosts_base = host->next; ++ } else { ++ /* ++ * Remove from middle of queue ++ * or bottom of queue ++ */ ++ for (temp = mp_hosts_base; ++ temp != NULL; ++ temp = temp->next) { ++ ++ if (temp->next == host) { ++ temp->next = host->next; ++ break; ++ } ++ } ++ } ++ } ++ KMEM_FREE(host, sizeof(mp_host_t)); ++ mp_num_hosts--; ++ } ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfg.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,181 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support ++ * Multi-path include file. ++ */ ++ ++#if !defined(_QLA_CFG_H) ++#define _QLA_CFG_H ++ ++#if defined(__cplusplus) ++extern "C" ++{ ++#endif ++ ++/* ++ * Failover definitions ++ */ ++#define FAILOVER_TYPE_COUNT 4 ++#define MP_NOTIFY_RESET_DETECTED 1 ++#define MP_NOTIFY_PWR_LOSS 2 ++#define MP_NOTIFY_LOOP_UP 3 ++#define MP_NOTIFY_LOOP_DOWN 4 ++#define MP_NOTIFY_BUS_RESET 5 ++#define FAILOVER_TYPE_ERROR_RETRY 1 ++#define MAX_NUMBER_PATHS FO_MAX_PATHS ++#define PORT_NAME_SIZE WWN_SIZE ++#define FAILOVER_NOTIFY_STATUS_ERROR QLA2X00_SUCCESS ++#define FAILOVER_NOTIFY_STATUS_SUCCESS QLA2X00_SUCCESS ++#define FAILOVER_NOTIFY_CDB_LENGTH_MAX FO_NOTIFY_CDB_LENGTH_MAX ++#define MAX_TARGETS_PER_DEVICE SDM_DEF_MAX_TARGETS_PER_DEVICE ++ ++/* ++ * Limits definitions. ++ */ ++#define MAX_LUNS_PER_DEVICE MAX_LUNS /* Maximum # of luns */ ++#define MAX_MP_DEVICES MAX_TARGETS /* Maximum # of virtual devs */ ++#define MAX_PATHS_PER_DEVICE 8 /* Maximum # of paths */ ++#if !defined(MAX_LUNS) ++#define MAX_LUNS 256 ++#endif ++#define MAX_HOSTS MAX_HOST_COUNT ++ ++/* Async notification types */ ++#define NOTIFY_EVENT_LINK_DOWN 1 /* Link went down */ ++#define NOTIFY_EVENT_LINK_UP 2 /* Link is back up */ ++#define NOTIFY_EVENT_RESET_DETECTED 3 /* Reset detected */ ++ ++/* MACROS */ ++#define qla2x00_is_portname_equal(N1,N2) \ ++ ((memcmp((N1),(N2),WWN_SIZE)==0?TRUE:FALSE)) ++#define qla2x00_is_nodename_equal(N1,N2) \ ++ ((memcmp((N1),(N2),WWN_SIZE)==0?TRUE:FALSE)) ++#if 0 ++#define qla2x00_allocate_path_list() \ ++ ((mp_path_list_t *)KMEM_ZALLOC(sizeof(mp_path_list_t))) ++#endif ++ ++/* ++ * Per-multipath driver parameters ++ */ ++typedef struct _mp_lun_data { ++ uint8_t data[MAX_LUNS]; ++#define LUN_DATA_ENABLED BIT_7 ++#define LUN_DATA_PREFERRED_PATH BIT_6 ++} ++mp_lun_data_t; ++ ++ ++#define PATH_INDEX_INVALID 0xff ++ ++/* ++ * Per-device collection of all paths. ++ */ ++typedef struct _mp_path_list { ++ struct _mp_path *last; /* ptrs to end of circular list of paths */ ++ uint8_t path_cnt; /* number of paths */ ++ uint8_t visible; /* visible path */ ++ uint16_t reserved1; /* Memory alignment */ ++ uint32_t reserved2; /* Memory alignment */ ++ uint8_t current_path[ MAX_LUNS_PER_DEVICE ]; /* current path for a given lun */ ++ uint16_t failover_cnt[ FAILOVER_TYPE_COUNT ]; ++} ++mp_path_list_t; ++ ++/* ++ * Definitions for failover notify SRBs. These SRBs contain failover notify ++ * CDBs to notify a target that a failover has occurred. ++ * ++ */ ++typedef struct _failover_notify_srb { ++ srb_t *srb; ++ uint16_t status; ++ uint16_t reserved; ++} ++failover_notify_srb_t; ++ ++/* ++ * Per-device multipath control data. ++ */ ++typedef struct _mp_device { ++ mp_path_list_t *path_list; /* Path list for device. */ ++ int dev_id; ++ int use_cnt; /* number of users */ ++ uint8_t nodename[WWN_SIZE]; /* World-wide node name. */ ++ /* World-wide port names. */ ++ uint8_t portnames[MAX_PATHS_PER_DEVICE][WWN_SIZE]; ++} ++mp_device_t; ++ ++/* ++ * Per-adapter multipath Host ++ */ ++typedef struct _mp_host { ++ struct _mp_host *next; /* ptr to next host adapter in list */ ++ scsi_qla_host_t *ha; /* ptr to lower-level driver adapter struct */ ++ int instance; /* OS instance number */ ++ struct list_head *fcports; /* Port chain for this adapter */ ++ mp_device_t *mp_devs[MAX_MP_DEVICES]; /* Multipath devices */ ++ ++ uint32_t flags; ++#define MP_HOST_FLAG_NEEDS_UPDATE BIT_0 /* Need to update device data. */ ++#define MP_HOST_FLAG_FO_ENABLED BIT_1 /* Failover enabled for this host */ ++#define MP_HOST_FLAG_DISABLE BIT_2 /* Bypass qla_cfg. */ ++#define MP_HOST_FLAG_LUN_FO_ENABLED BIT_3 /* lun Failover enabled */ ++ ++ uint8_t nodename[WWN_SIZE]; ++ uint8_t portname[WWN_SIZE]; ++ uint16_t MaxLunsPerTarget; ++ ++ uint16_t relogin_countdown; ++} ++mp_host_t; ++ ++/* ++ * Describes path a single. ++ */ ++typedef struct _mp_path { ++ struct _mp_path *next; /* next path in list */ ++ struct _mp_host *host; /* Pointer to adapter */ ++ fc_port_t *port; /* FC port info */ ++ uint16_t id; /* Path id (index) */ ++ uint8_t mp_byte; /* Multipath control byte */ ++#define MP_MASK_HIDDEN 0x80 ++#define MP_MASK_UNCONFIGURED 0x40 ++#define MP_MASK_PRIORITY 0x07 ++ ++ uint8_t relogin; /* Need to relogin to port */ ++ uint8_t config; /* User configured path */ ++ uint8_t reserved[3]; ++ mp_lun_data_t lun_data; /* Lun data information */ ++ uint8_t portname[WWN_SIZE]; /* Port name of this target. */ ++} ++mp_path_t; ++ ++/* ++ * Failover notification requests from host driver. ++ */ ++typedef struct failover_notify_entry { ++ struct scsi_address *os_addr; ++} ++failover_notify_t; ++ ++#endif /* _QLA_CFG_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfgln.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,726 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support Driver ++ * Solaris specific functions ++ * ++ */ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "qlfo.h" ++ ++#define MAX_SEARCH_STR_SIZE 512 ++ ++/* ++ * qla2x00_set_lun_data_from_config ++ * Set lun_data byte from the configuration parameters. ++ * ++ * Input: ++ * host -- pointer to host adapter structure. ++ * port -- pointer to port ++ * tgt -- target number ++ * dev_no -- device number ++ */ ++void ++qla2x00_set_lun_data_from_config(mp_host_t *host, fc_port_t *port, ++ uint16_t tgt, uint16_t dev_no) ++{ ++ char *propbuf; /* As big as largest search string */ ++ int rval; ++ int16_t lun, l; ++ scsi_qla_host_t *ha = host->ha; ++ mp_device_t *dp; ++ lun_bit_mask_t *plun_mask; ++ lun_bit_mask_t *mask_ptr; ++ mp_path_list_t *pathlist; ++#if 0 ++ uint8_t control_byte; ++#endif ++ ++ mp_path_t *path; ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&propbuf, ++ MAX_SEARCH_STR_SIZE)) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "propbuf requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ MAX_SEARCH_STR_SIZE);) ++ return; ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&plun_mask, ++ sizeof(lun_bit_mask_t))) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "lun_mask requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(lun_bit_mask_t));) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ mask_ptr = plun_mask; ++ ++ dp = host->mp_devs[tgt]; ++ if (dp == NULL) { ++ printk("qla2x00_set_lun_data_from_config: Target %d " ++ "not found for hba %d\n",tgt, host->instance); ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ if ( (pathlist = dp->path_list) == NULL ) { ++ printk("qla2x00_set_lun_data_from_config: path list " ++ "not found for target %d\n", tgt); ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ if ((path = qla2x00_find_path_by_name(host, pathlist, ++ port->port_name)) == NULL ) { ++ printk("qla2x00_set_lun_data_from_config: No path found " ++ "for target %d\n", tgt); ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ /* clear port information */ ++ path->port = NULL; ++ ++#if 0 ++ /* 02/06/01 - move to build path tree */ ++ /* ++ * Get "target-N-device-N-control" if property is present then all ++ * luns are visible. ++ */ ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-control", ++ host->instance, tgt, dev_no); ++ DEBUG3(printk("build_tree: %s\n",propbuf);) ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)(&control_byte), sizeof(control_byte)); ++ if (rval != -1) { ++ if (!((control_byte & MP_MASK_HIDDEN) || ++ (control_byte & MP_MASK_UNCONFIGURED))) { ++ pathlist->visible = path->id; ++ DEBUG(printk("qla2x00_set_lun_data_from_config: " ++ "found visible path id %d hba %d\n", ++ path->id, host->instance);) ++ } else { ++ pathlist->visible = PATH_INDEX_INVALID; /* 01/30 */ ++ DEBUG(printk("qla2x00_set_lun_data_from_config: " ++ "found hidden path id %d hba %d\n", ++ path->id, host->instance);) ++ } ++ path->mp_byte = control_byte; ++ DEBUG(printk("qla2x00_set_lun_data_from_config: " ++ "control byte 0x%x for path id %d hba %d\n", ++ path->mp_byte, path->id, host->instance);) ++ } ++#endif ++ ++ /* Get "target-N-device-N-preferred" as a 256 bit lun_mask*/ ++ sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-preferred", ++ ha->instance, tgt, dev_no); ++ DEBUG2(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)(plun_mask), sizeof(lun_bit_mask_t)); ++ ++ if (rval == -1) { ++ /* EMPTY */ ++ DEBUG2(printk("qla2x00_set_lun_data_from_config: " ++ "NO Preferred mask - ret %d\n", rval);) ++ } else { ++ if (rval != sizeof(lun_bit_mask_t)) { ++ /* EMPTY */ ++ printk("qla2x00_set_lun_data_from_config: " ++ "Preferred mask len %d is incorrect.\n", rval); ++ } ++ ++ DEBUG3(printk("qla2x00_set_lun_data_from_config: " ++ "Preferred mask read:\n");) ++ DEBUG3(qla2x00_dump_buffer((char *)plun_mask, ++ sizeof(lun_bit_mask_t));) ++ ++ for (lun = MAX_LUNS-1, l =0; lun >= 0; lun--, l++ ) { ++ if (EXT_IS_LUN_BIT_SET(mask_ptr, lun)) { ++ path->lun_data.data[l] |= ++ LUN_DATA_PREFERRED_PATH; ++ pathlist->current_path[l] = path->id; ++ } else { ++ path->lun_data.data[l] &= ++ ~LUN_DATA_PREFERRED_PATH; ++ } ++ } ++ ++ } ++ ++ /* Get "target-N-device-N-lun-disable" as a 256 bit lun_mask*/ ++ sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled", ++ ha->instance, tgt, dev_no); ++ DEBUG3(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)plun_mask, sizeof(lun_bit_mask_t)); ++ if (rval == -1) { ++ /* default: all luns enabled */ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ path->lun_data.data[lun] |= LUN_DATA_ENABLED; ++ } ++ } else { ++ if (rval != sizeof(lun_bit_mask_t)) { ++ printk("qla2x00_set_lun_data_from_config: Enable " ++ "mask has wrong size %d != %d\n", ++ rval, (int)sizeof(lun_bit_mask_t)); ++ } else { ++ for (lun = MAX_LUNS-1, l =0; lun >= 0; lun--, l++) { ++ /* our bit mask is inverted */ ++ if (!EXT_IS_LUN_BIT_SET(mask_ptr,lun)) ++ path->lun_data.data[l] |= ++ LUN_DATA_ENABLED; ++ else ++ path->lun_data.data[l] &= ++ ~LUN_DATA_ENABLED; ++ } ++ } ++ } ++ ++ DEBUG3(printk("qla2x00_set_lun_data_from_config: Luns data for " ++ "device %p, instance %d, path id=%d\n", ++ dp,host->instance,path->id);) ++ DEBUG3(qla2x00_dump_buffer((char *)&path->lun_data.data[0], 64);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ LEAVE("qla2x00_set_lun_data_from_config"); ++} ++ ++ ++ ++/* ++ * qla2x00_cfg_build_path_tree ++ * Find all path properties and build a path tree. The ++ * resulting tree has no actual port assigned to it ++ * until the port discovery is done by the lower level. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_cfg_build_path_tree(scsi_qla_host_t *ha) ++{ ++ char *propbuf; ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ fc_port_t *port; ++ uint16_t dev_no = 0, tgt_no; ++ int instance, rval; ++ mp_host_t *host = NULL; ++ uint8_t *name; ++ int done; ++ uint8_t control_byte; ++ ++ ++ ENTER("qla2x00_cfg_build_path_tree"); ++ ++ printk(KERN_INFO ++ "qla02%d: ConfigRequired is set. \n", (int)ha->instance); ++ DEBUG(printk("qla2x00_cfg_build_path_tree: hba =%d", ++ (int)ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&propbuf, ++ MAX_SEARCH_STR_SIZE)) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "propbuf requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ MAX_SEARCH_STR_SIZE);) ++ return; ++ } ++ ++ /* Look for adapter nodename in properties */ ++ sprintf(propbuf, "scsi-qla%ld-adapter-port", ha->instance); ++ DEBUG(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, port_name, WWN_SIZE); ++ if (rval != WWN_SIZE) { ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ /* Does nodename match the host adapter nodename? */ ++ name = &ha->init_cb->port_name[0]; ++ if (!qla2x00_is_nodename_equal(name, port_name)) { ++ printk(KERN_INFO ++ "scsi(%d): Adapter nodenames don't match - ha = %p.\n", ++ (int)ha->instance,ha); ++ DEBUG(printk("qla(%d): Adapter nodenames don't match - " ++ "ha = %p.\n", ++ (int)ha->instance,ha);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ instance = ha->instance; ++ if ((host = qla2x00_alloc_host(ha)) == NULL) { ++ printk(KERN_INFO ++ "scsi(%d): Couldn't allocate host - ha = %p.\n", ++ (int)instance,ha); ++ } else { ++ /* create a dummy port */ ++ port = (fc_port_t *)KMEM_ZALLOC(sizeof (fc_port_t),9); ++ if (port == NULL) { ++ printk(KERN_INFO ++ "scsi(%d): Couldn't allocate port.\n", ++ (int)instance); ++ DEBUG(printk("qla(%d): Couldn't allocate port.\n", ++ (int)host->instance);) ++ /* remove host */ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ done = 0; ++ ++ /* For each target on the host bus adapter */ ++ for (tgt_no = 0; tgt_no < MAX_MP_DEVICES && ++ !done; tgt_no++) { ++ ++ /* get all paths for this target */ ++ for (dev_no = 0; dev_no < MAX_PATHS_PER_DEVICE && ++ !done ; dev_no++) { ++ ++ /* ++ * O(N*M) scan, should ideally check if there ++ * are any tgt entries present, if not, then ++ * continue. ++ * ++ * sprintf(propbuf, ++ * "scsi-qla%d-tgt-%d-", ++ * instance, tgt_no); ++ * if (strstr(ha->cmdline, propbuf) == NULL) ++ * continue; ++ * ++ */ ++ memset(port, 0, sizeof (fc_port_t)); ++ ++ /* ++ * Get "target-N-device-N-node" is a 16-chars ++ * number ++ */ ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-node", ++ instance, tgt_no, dev_no); ++ DEBUG(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ node_name, WWN_SIZE); ++ if (rval != WWN_SIZE) ++ continue; ++ ++ memcpy(port->node_name, node_name, WWN_SIZE); ++ ++ /* ++ * Get "target-N-device-N-port" is a 16-chars ++ * number ++ */ ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-port", ++ instance, tgt_no, dev_no); ++ DEBUG(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ port_name, WWN_SIZE); ++ if (rval != WWN_SIZE) ++ continue; ++ ++ memcpy(port->node_name, node_name, WWN_SIZE); ++ memcpy(port->port_name, port_name, WWN_SIZE); ++ port->flags |= FC_CONFIG; ++ ++ /* ++ * Get "target-N-device-N-control" if property ++ * is present then all luns are visible. ++ */ ++ sprintf(propbuf, ++ "scsi-qla%d-tgt-%d-di-%d-control", ++ instance, tgt_no, dev_no); ++ DEBUG3(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)(&control_byte), ++ sizeof(control_byte)); ++ if (rval == -1) { ++ /* error getting string. go to next. */ ++ continue; ++ } ++ ++ DEBUG(printk("build_tree: control byte 0x%x\n", ++ control_byte);) ++ ++ port->mp_byte = control_byte; ++ DEBUG(printk("build_tree: update_mp_device " ++ "host=%p, port=%p, tgt_no=%d\n", ++ host, port, tgt_no);) ++ ++ qla2x00_update_mp_device(host, port, tgt_no); ++ qla2x00_set_lun_data_from_config(host, ++ port, tgt_no, dev_no); ++ } ++ } ++ KMEM_FREE(port, sizeof (fc_port_t)); ++ } ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ LEAVE("qla2x00_cfg_build_path_tree"); ++ DEBUG(printk("Leaving: qla2x00_cfg_build_path_tree\n");) ++} ++ ++/* ++ * qla2x00_cfg_display_devices ++ * This routine will the node names of the different devices found ++ * after port inquiry. ++ * ++ * Input: ++ * ++ * Returns: ++ * None. ++ */ ++void qla2x00_cfg_display_devices(void) ++{ ++ mp_host_t *host; ++ int id; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *path_list; ++ int cnt, i, dev_no; ++ int instance; ++ lun_bit_mask_t lun_mask; ++ int mask_set; ++ uint8_t l; ++ ++ printk("qla2x00_cfg_display_devices\n"); ++ for (host = mp_hosts_base; (host); host = host->next) { ++ ++ instance = (int) host->instance; ++ /* Display the node name for adapter */ ++ printk(KERN_INFO ++ "scsi-qla%d-adapter-port=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ instance, ++ host->portname[0], ++ host->portname[1], ++ host->portname[2], ++ host->portname[3], ++ host->portname[4], ++ host->portname[5], ++ host->portname[6], ++ host->portname[7]); ++ ++ for (id = 0; id < MAX_MP_DEVICES; id++) { ++ if( (dp = host->mp_devs[id] ) == NULL ) ++ continue; ++ ++ path_list = dp->path_list; ++ ++ ++ if( (path = path_list->last) != NULL ) { ++ /* Print out device port names */ ++ path = path->next; /* first path */ ++ for (dev_no = 0, cnt = 0; ++ cnt < path_list->path_cnt; ++ path = path->next, cnt++) { ++ ++ /* skip others if not our host */ ++ if (host != path->host) ++ continue; ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-node=" ++ "%02x%02x%02x%02x" ++ "%02x%02x%02x%02x\\;\n", ++ instance, id, path->id, ++ dp->nodename[0], ++ dp->nodename[1], ++ dp->nodename[2], ++ dp->nodename[3], ++ dp->nodename[4], ++ dp->nodename[5], ++ dp->nodename[6], ++ dp->nodename[7]); ++ ++ /* port_name */ ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-port=" ++ "%02x%02x%02x%02x" ++ "%02x%02x%02x%02x\\;\n", ++ instance, id, path->id, ++ path->portname[0], ++ path->portname[1], ++ path->portname[2], ++ path->portname[3], ++ path->portname[4], ++ path->portname[5], ++ path->portname[6], ++ path->portname[7]); ++ ++ /* control byte */ ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-" ++ "control=%02x\\;\n", ++ instance, id, path->id, ++ path->mp_byte); ++ ++ /* ++ * Build preferred bit mask for this ++ * path */ ++ memset(&lun_mask, 0, sizeof(lun_mask)); ++ mask_set = 0; ++ for (i = 0; i < MAX_LUNS; i++) { ++ l = (uint8_t)(i & 0xFF); ++ if (path_list->current_path[l] == path->id ) { ++ EXT_SET_LUN_BIT((&lun_mask),l); ++ mask_set++; ++ } ++ } ++ if (mask_set) { ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-preferred=%08x%08x%08x%08x%08x%08x%08x%08x\\;\n", ++ instance, id, path->id, ++ *((uint32_t *) &lun_mask.mask[28]), ++ *((uint32_t *) &lun_mask.mask[24]), ++ *((uint32_t *) &lun_mask.mask[20]), ++ *((uint32_t *) &lun_mask.mask[16]), ++ *((uint32_t *) &lun_mask.mask[12]), ++ *((uint32_t *) &lun_mask.mask[8]), ++ *((uint32_t *) &lun_mask.mask[4]), ++ *((uint32_t *) &lun_mask.mask[0]) ); ++ } ++ /* ++ * Build disable bit mask for this path ++ */ ++ mask_set = 0; ++ for (i = 0; i < MAX_LUNS; i++) { ++ l = (uint8_t)(i & 0xFF); ++ if (!(path->lun_data.data[l] & ++ LUN_DATA_ENABLED) ) { ++ ++ mask_set++; ++ } ++ } ++ if (mask_set) { ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-lun-disable=%08x%08x%08x%08x%08x%08x%08x%08x\\;\n", ++ instance, id, path->id, ++ *((uint32_t *) &lun_mask.mask[28]), ++ *((uint32_t *) &lun_mask.mask[24]), ++ *((uint32_t *) &lun_mask.mask[20]), ++ *((uint32_t *) &lun_mask.mask[16]), ++ *((uint32_t *) &lun_mask.mask[12]), ++ *((uint32_t *) &lun_mask.mask[8]), ++ *((uint32_t *) &lun_mask.mask[4]), ++ *((uint32_t *) &lun_mask.mask[0]) ); ++ } ++ dev_no++; ++ } ++ ++ } ++ } ++ } ++} ++ ++#if 0 ++int qla2x00_cfg_build_range( mp_path_t *path, uint8_t *buf, int siz, uint8_t mask ) ++{ ++ int i; ++ int max, min; ++ int colonflg = FALSE; ++ int len = 0; ++ ++ max = -1; ++ min = 0; ++ for (i = 0; i < MAX_LUNS; i++) { ++ if( (path->lun_data.data[i] & mask) ) { ++ max = i; ++ } else { ++ if( colonflg && max >= min ) { ++ len += sprintf(&buf[len],":"); ++ if( len > siz) ++ return len; ++ colonflg = FALSE; ++ } ++ if (max > min ) { ++ len += sprintf(&buf[len],"%02x-%02x",min,max); ++ if( len > siz) ++ return len; ++ colonflg = TRUE; ++ } else if ( max == min ) { ++ len += sprintf(&buf[len],"%02x",max); ++ if( len > siz) ++ return len; ++ colonflg = TRUE; ++ } ++ min = i + 1; ++ max = i; ++ } ++ } ++ DEBUG4(printk("build_range: return len =%d\n",len);) ++ return(len); ++} ++#endif ++ ++#if 0 ++/* ++ * qla2x00_cfg_proc_display_devices ++ * This routine will the node names of the different devices found ++ * after port inquiry. ++ * ++ * Input: ++ * ++ * Returns: ++ * None. ++ */ ++int qla2x00_cfg_proc_display_devices(scsi_qla_host_t *ha) ++{ ++ mp_host_t *host; ++ int id; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *path_list; ++ int cnt, i; ++ int instance; ++ lun_bit_mask_t lun_mask; ++ int mask_set; ++ uint8_t l; ++ fc_port_t *port; ++ int len = 0; ++ ++ for (host = mp_hosts_base; (host); host = host->next) { ++ ++ if( host->ha != ha ) ++ continue; ++ ++ instance = (int) host->instance; ++ ++ /* Display the node name for adapter */ ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-adapter-node=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ instance, ++ host->nodename[0], ++ host->nodename[1], ++ host->nodename[2], ++ host->nodename[3], ++ host->nodename[4], ++ host->nodename[5], ++ host->nodename[6], ++ host->nodename[7]); ++ ++ ++ for (id = 0; id < MAX_MP_DEVICES; id++) { ++ if( (dp = host->mp_devs[id] ) == NULL ) ++ continue; ++ ++ path_list = dp->path_list; ++ ++ if( (path = path_list->last) != NULL ) { ++ /* Print out device port names */ ++ path = path->next; /* first path */ ++ for (cnt = 0; cnt < path_list->path_cnt; path = path->next, cnt++) { ++ /* skip others if not our host */ ++ if (host != path->host) ++ continue; ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-node=%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ instance, id, path->id, ++ dp->nodename[0], ++ dp->nodename[1], ++ dp->nodename[2], ++ dp->nodename[3], ++ dp->nodename[4], ++ dp->nodename[5], ++ dp->nodename[6], ++ dp->nodename[7]); ++ ++ /* port_name */ ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-port=%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ instance, id, path->id, ++ path->portname[0], ++ path->portname[1], ++ path->portname[2], ++ path->portname[3], ++ path->portname[4], ++ path->portname[5], ++ path->portname[6], ++ path->portname[7]); ++ ++ if( path_list->visible == path->id ) { ++ len += sprintf(PROC_BUF, "scsi-qla%d-target-%d-path-%d-visible=%02x;\n", ++ instance, id, path->id, path->id); ++ } ++ ++ len +=sprintf(PROC_BUF, "scsi-qla%d-target-%d-path-%d-control=%02x;\n", ++ instance, id, path->id, path->mp_byte); ++ ++ /* Build preferred bit mask for this path */ ++ memset(&lun_mask, 0, sizeof(lun_mask)); ++ mask_set = 0; ++ for (i = 0; i < MAX_LUNS_PER_DEVICE; i++) { ++ l = (uint8_t)(i & 0xFF); ++ if( path_list->current_path[l] == path->id ) { ++ EXT_SET_LUN_BIT((&lun_mask),l); ++ mask_set++; ++ } ++ } ++ if( mask_set && EXT_DEF_MAX_LUNS <= 256 ) { ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-preferred=%08x%08x%08x%08x%08x%08x%08x%08x;\n", ++ instance, id, path->id, ++ *((uint32_t *) &lun_mask.mask[0]), ++ *((uint32_t *) &lun_mask.mask[4]), ++ *((uint32_t *) &lun_mask.mask[8]), ++ *((uint32_t *) &lun_mask.mask[12]), ++ *((uint32_t *) &lun_mask.mask[16]), ++ *((uint32_t *) &lun_mask.mask[20]), ++ *((uint32_t *) &lun_mask.mask[24]), ++ *((uint32_t *) &lun_mask.mask[28]) ); ++ } ++ ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-lun-enable=%08x%08x%08x%08x%08x%08x%08x%08x;\n", ++ instance, id, path->id, ++ *((uint32_t *) &path->lun_data.data[0]), ++ *((uint32_t *) &path->lun_data.data[4]), ++ *((uint32_t *) &path->lun_data.data[8]), ++ *((uint32_t *) &path->lun_data.data[12]), ++ *((uint32_t *) &path->lun_data.data[16]), ++ *((uint32_t *) &path->lun_data.data[20]), ++ *((uint32_t *) &path->lun_data.data[24]), ++ *((uint32_t *) &path->lun_data.data[28]) ); ++ ++ } /* for */ ++ } ++ } ++ } ++ return( len ); ++} ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_dbg.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1000 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ */ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++ ++#if defined(ISP2300) ++/** ++ * qla2x00_fw_dump() - Dumps binary data from the 2300 firmware. ++ * @ha: SCSI driver HA context ++ * @hardware_locked: Called with the hardware_lock ++ */ ++void ++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked) ++{ ++ int rval; ++ uint32_t i; ++ uint32_t cnt, timer; ++ uint32_t risc_address; ++ uint16_t risc_code_size; ++ uint16_t mb0, mb2; ++ ++ uint16_t data, stat; ++ device_reg_t *reg; ++ uint16_t *dmp_reg; ++ unsigned long flags; ++ ++ ++ reg = ha->iobase; ++ flags = 0; ++ ++ if (!hardware_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ printk("\n\n[==>BEG]\n"); ++ ++ printk("HCCR Register:\n"); ++ printk("%04x\n\n", RD_REG_WORD(®->hccr)); ++ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ SYS_DELAY(100); ++ ++ printk("PBIU Registers:\n"); ++ dmp_reg = (uint16_t *)(reg + 0); ++ for (i = 0; i < 8; i++) ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ ++ printk("\n\n"); ++ ++ printk("ReqQ-RspQ-Risc2Host Status registers:\n"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10); ++ for (i = 0; i < 8; i++) ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ ++ printk("\n\n"); ++ ++ printk("Mailbox Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x40); ++ for (i = 0; i < 32; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x40); ++ printk("Auto Request Response DMA Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 32; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x50); ++ printk("DMA Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 48; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x00); ++ printk("RISC Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2000); ++ printk("RISC GP0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2200); ++ printk("RISC GP1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2400); ++ printk("RISC GP2 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2600); ++ printk("RISC GP3 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2800); ++ printk("RISC GP4 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2A00); ++ printk("RISC GP5 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2C00); ++ printk("RISC GP6 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2E00); ++ printk("RISC GP7 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x10); ++ printk("Frame Buffer Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x20); ++ printk("FPM B0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x30); ++ printk("FPM B1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ for (i = 6000000; i && data & CSR_ISP_SOFT_RESET; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->ctrl_status); ++ } ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ SYS_DELAY(10); ++ } else { ++ data = RD_REG_WORD(®->mailbox0); ++ for (i = 6000000; i && data == MBS_BUSY; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->mailbox0); ++ } ++ } ++ ++ rval = QLA2X00_SUCCESS; ++ mb0 = mb2 = 0; ++ printk("Code RAM Dump:"); ++ risc_address = 0x800; ++ risc_code_size = 0xffff - 0x800 + 1; ++ WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_WORD); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%04x: ", cnt + 0x0800); ++ WRT_REG_WORD(®->mailbox1, (uint16_t)risc_address++); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n\n"); ++ ++ mb0 = mb2 = 0; ++ printk("Stack RAM Dump:"); ++ risc_address = 0x10000; ++ risc_code_size = 0x107ff - 0x10000 + 1; ++ WRT_REG_WORD(®->mailbox0, 0xf /* MBC_READ_RAM_EXTENDED */); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%05x: ", cnt + 0x10000); ++ WRT_REG_WORD(®->mailbox1, LSW(risc_address)); ++ WRT_REG_WORD(®->mailbox8, MSW(risc_address++)); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n\n"); ++ ++ mb0 = mb2 = 0; ++ printk("Data RAM Dump:"); ++ risc_address = 0x10800; ++ risc_code_size = 0x1ffff - 0x10800 + 1; ++ WRT_REG_WORD(®->mailbox0, 0xf /* MBC_READ_RAM_EXTENDED */); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%05x: ", cnt + 0x10800); ++ WRT_REG_WORD(®->mailbox1, LSW(risc_address)); ++ WRT_REG_WORD(®->mailbox8, MSW(risc_address++)); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n[<==END] ISP DEBUG DUMP\n"); ++ ++ if (!hardware_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++ ++#elif defined(ISP2200) ++ ++/** ++ * qla2x00_fw_dump() - Dumps binary data from the 2200 firmware. ++ * @ha: SCSI driver HA context ++ * @hardware_locked: Called with the hardware_lock ++ */ ++void ++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked) ++{ ++ int rval; ++ uint32_t i; ++ uint32_t cnt, timer; ++ uint32_t risc_address; ++ uint16_t risc_code_size; ++ uint16_t mb0, mb2; ++ ++ uint16_t data, stat; ++ device_reg_t *reg; ++ uint16_t *dmp_reg; ++ unsigned long flags; ++ ++ ++ reg = ha->iobase; ++ flags = 0; ++ ++ if (!hardware_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ printk("\n\n[==>BEG]\n"); ++ ++ printk("HCCR Register:\n"); ++ printk("%04x\n\n", RD_REG_WORD(®->hccr)); ++ ++ /* Pause RISC. */ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ for (cnt = 30000; cnt; cnt--) { ++ if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) ++ break; ++ SYS_DELAY(10); ++ } ++ if (!cnt) ++ goto done; ++ ++ printk("PBIU Registers:\n"); ++ dmp_reg = (uint16_t *)(reg + 0); ++ for (i = 0; i < 8; i++) ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ ++ printk("\n\n"); ++ ++ printk("Mailbox Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10); ++ for (i = 0; i < 32; i++) { ++ if (i == 8) ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0xe0); ++ ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ printk("DMA Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x20); ++ for (i = 0; i < 48; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x00); ++ printk("RISC Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2000); ++ printk("RISC GP0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2100); ++ printk("RISC GP1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2200); ++ printk("RISC GP2 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2300); ++ printk("RISC GP3 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2400); ++ printk("RISC GP4 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2500); ++ printk("RISC GP5 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2600); ++ printk("RISC GP6 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2700); ++ printk("RISC GP7 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x10); ++ printk("Frame Buffer Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x20); ++ printk("FPM B0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x30); ++ printk("FPM B1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ for (i = 6000000; i && data & CSR_ISP_SOFT_RESET; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->ctrl_status); ++ } ++ data = RD_REG_WORD(®->mailbox0); ++ for (i = 6000000; i && data == MBS_BUSY; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->mailbox0); ++ } ++ ++ /* Pause RISC. */ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ for (cnt = 30000; cnt; cnt--) { ++ if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) ++ break; ++ SYS_DELAY(10); ++ } ++ if (!cnt) ++ goto done; ++ ++ rval = QLA2X00_SUCCESS; ++ mb0 = mb2 = 0; ++ printk("RISC SRAM:"); ++ risc_address = 0x1000; ++ risc_code_size = 0xffff - 0x1000 + 1; ++ WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_WORD); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%04x: ", cnt + 0x1000); ++ WRT_REG_WORD(®->mailbox1, (uint16_t)risc_address++); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n[<==END] ISP DEBUG DUMP\n"); ++ ++done: ++ if (!hardware_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++#else /* if defined(ISP2100) */ ++ ++/** ++ * qla2x00_fw_dump() - Dumps binary data from the 2100 firmware. ++ * @ha: SCSI driver HA context ++ * @hardware_locked: Called with the hardware_lock ++ * ++ * NOTE: On the ISP2100, this function will not be implemented. ++ */ ++void ++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked) ++{ ++ /* NO-OP */ ++ printk("\n\n[==>BEG]\n"); ++ printk("\n[<==END] ISP DEBUG DUMP\n"); ++} ++ ++#endif /* if defined(ISP2300) */ ++ ++//FIXME ++ ++/****************************************************************************/ ++/* Driver Debug Functions. */ ++/****************************************************************************/ ++ ++void ++qla2x00_dump_regs(struct Scsi_Host *host) ++{ ++ /* Assumes non-memory mapped I/O */ ++ printk("Mailbox registers:\n"); ++ printk("scsi(%d): mbox 0 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x10)); ++ printk("scsi(%d): mbox 1 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x12)); ++ printk("scsi(%d): mbox 2 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x14)); ++ printk("scsi(%d): mbox 3 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x16)); ++ printk("scsi(%d): mbox 4 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x18)); ++ printk("scsi(%d): mbox 5 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x1a)); ++} ++ ++ ++void ++qla2x00_dump_buffer(uint8_t * b, uint32_t size) ++{ ++ uint32_t cnt; ++ uint8_t c; ++ ++ printk(" 0 1 2 3 4 5 6 7 8 9 " ++ "Ah Bh Ch Dh Eh Fh\n"); ++ printk("-----------------------------------------" ++ "----------------------\n"); ++ ++ for (cnt = 0; cnt < size;) { ++ c = *b++; ++ printk("%02x",(uint32_t) c); ++ cnt++; ++ if (!(cnt % 16)) ++ printk("\n"); ++ else ++ printk(" "); ++ } ++ if (cnt % 16) ++ printk("\n"); ++} ++ ++/************************************************************************** ++ * qla2x00_print_scsi_cmd ++ * Dumps out info about the scsi cmd and srb. ++ * Input ++ * cmd : Scsi_Cmnd ++ **************************************************************************/ ++void ++qla2x00_print_scsi_cmd(Scsi_Cmnd * cmd) ++{ ++ struct scsi_qla_host *ha; ++ struct Scsi_Host *host; ++ srb_t *sp; ++ struct os_lun *lq; ++ fc_port_t *fcport; ++ ++ int i; ++ ++ host = cmd->device->host; ++ ha = (struct scsi_qla_host *) host->hostdata; ++ ++ sp = (srb_t *) CMD_SP(cmd); ++ printk("SCSI Command @= 0x%p, Handle=0x%08lx\n", ++ cmd, (u_long) CMD_HANDLE(cmd)); ++ printk(" chan=%d, target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n", ++ SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), SCSI_LUN_32(cmd), ++ cmd->cmd_len); ++ printk(" CDB = "); ++ for (i = 0; i < cmd->cmd_len; i++) { ++ printk("0x%02x ", cmd->cmnd[i]); ++ } ++ printk("\n seg_cnt =%d, retries=%d, serial_number_at_timeout=0x%lx\n", ++ cmd->use_sg, ++ cmd->retries, cmd->serial_number_at_timeout); ++ printk(" request buffer=0x%p, request buffer len=0x%x\n", ++ cmd->request_buffer, ++ cmd->request_bufflen); ++ printk(" tag=%d, flags=0x%x, transfersize=0x%x \n", ++ cmd->tag, cmd->flags, cmd->transfersize); ++ printk(" serial_number=%d, SP=%p\n", (int) cmd->serial_number,sp); ++ printk(" data direction=%d\n", cmd->sc_data_direction); ++ if (sp) { ++ printk(" sp flags=0x%x\n", sp->flags); ++ printk(" r_start=0x%lx, u_start=0x%lx, " ++ "f_start=0x%lx, state=%d\n", ++ sp->r_start, sp->u_start, ++ sp->f_start, sp->state); ++ ++ lq = sp->lun_queue; ++ fcport = lq->fclun->fcport; ++ printk(" e_start= 0x%lx, ext_history= %d, " ++ "fo retry=%d, loopid =%x, port path=%d\n", ++ sp->e_start, sp->ext_history, ++ sp->fo_retry_cnt, ++ fcport->loop_id, ++ fcport->cur_path); ++ } ++} ++ ++/* ++ * qla2x00_print_q_info ++ * Prints queue info ++ * Input ++ * q: lun queue ++ */ ++void ++qla2x00_print_q_info(struct os_lun *q) ++{ ++ printk("Queue info: flags=0x%lx\n", q->q_flag); ++} ++ ++#if defined(QL_DEBUG_ROUTINES) ++/* ++ * qla2x00_formatted_dump_buffer ++ * Prints string plus buffer. ++ * ++ * Input: ++ * string = Null terminated string (no newline at end). ++ * buffer = buffer address. ++ * wd_size = word size 8, 16, 32 or 64 bits ++ * count = number of words. ++ */ ++void ++qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer, ++ uint8_t wd_size, uint32_t count) ++{ ++ uint32_t cnt; ++ uint16_t *buf16; ++ uint32_t *buf32; ++ ++ if (strcmp(string, "") != 0) ++ printk("%s\n",string); ++ ++ switch (wd_size) { ++ case 8: ++ printk(" 0 1 2 3 4 5 6 7 " ++ "8 9 Ah Bh Ch Dh Eh Fh\n"); ++ printk("-----------------------------------------" ++ "-------------------------------------\n"); ++ ++ for (cnt = 1; cnt <= count; cnt++, buffer++) { ++ printk("%02x",*buffer); ++ if (cnt % 16 == 0) ++ printk("\n"); ++ else ++ printk(" "); ++ } ++ if (cnt % 16 != 0) ++ printk("\n"); ++ break; ++ case 16: ++ printk(" 0 2 4 6 8 Ah " ++ " Ch Eh\n"); ++ printk("-----------------------------------------" ++ "-------------\n"); ++ ++ buf16 = (uint16_t *) buffer; ++ for (cnt = 1; cnt <= count; cnt++, buf16++) { ++ printk("%4x",*buf16); ++ ++ if (cnt % 8 == 0) ++ printk("\n"); ++ else if (*buf16 < 10) ++ printk(" "); ++ else ++ printk(" "); ++ } ++ if (cnt % 8 != 0) ++ printk("\n"); ++ break; ++ case 32: ++ printk(" 0 4 8 Ch\n"); ++ printk("------------------------------------------\n"); ++ ++ buf32 = (uint32_t *) buffer; ++ for (cnt = 1; cnt <= count; cnt++, buf32++) { ++ printk("%8x", *buf32); ++ ++ if (cnt % 4 == 0) ++ printk("\n"); ++ else if (*buf32 < 10) ++ printk(" "); ++ else ++ printk(" "); ++ } ++ if (cnt % 4 != 0) ++ printk("\n"); ++ break; ++ default: ++ break; ++ } ++} ++ ++#endif ++ ++ ++#if STOP_ON_ERROR ++/************************************************************************** ++* qla2x00_panic ++* ++**************************************************************************/ ++static void ++qla2x00_panic(char *cp, struct Scsi_Host *host) ++{ ++ struct scsi_qla_host *ha; ++ long *fp; ++ ++ ha = (struct scsi_qla_host *) host->hostdata; ++ DEBUG2(ql2x_debug_print = 1;); ++ printk("qla2100 - PANIC: %s\n", cp); ++ printk("Current time=0x%lx\n", jiffies); ++ printk("Number of pending commands =0x%lx\n", ha->actthreads); ++ printk("Number of queued commands =0x%lx\n", ha->qthreads); ++ printk("Number of free entries = (%d)\n", ha->req_q_cnt); ++ printk("Request Queue @ 0x%lx, Response Queue @ 0x%lx\n", ++ ha->request_dma, ha->response_dma); ++ printk("Request In Ptr %d\n", ha->req_ring_index); ++ fp = (long *) &ha->flags; ++ printk("HA flags =0x%lx\n", *fp); ++ qla2x00_dump_requests(ha); ++ qla2x00_dump_regs(host); ++ cli(); ++ for (;;) { ++ udelay(2); ++ barrier(); ++ /* cpu_relax();*/ ++ } ++ sti(); ++} ++ ++#endif ++ ++/************************************************************************** ++* qla2x00_dump_requests ++* ++**************************************************************************/ ++void ++qla2x00_dump_requests(scsi_qla_host_t *ha) ++{ ++ ++ Scsi_Cmnd *cp; ++ srb_t *sp; ++ int i; ++ ++ printk("Outstanding Commands on controller:\n"); ++ ++ for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ if ((sp = ha->outstanding_cmds[i]) == NULL) ++ continue; ++ if ((cp = sp->cmd) == NULL) ++ continue; ++ ++ printk("(%d): Pid=%d, sp flags=0x%lx, cmd=0x%p\n", ++ i, ++ (int)sp->cmd->serial_number, ++ (long)sp->flags,CMD_SP(sp->cmd)); ++ } ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_dbg.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,138 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++#undef ENTER_TRACE ++/* ++* Macros use for debugging the driver. ++*/ ++#if defined(ENTER_TRACE) ++#define ENTER(x) do { printk("qla2100 : Entering %s()\n", x); } while (0) ++#define LEAVE(x) do { printk("qla2100 : Leaving %s()\n", x); } while (0) ++#define ENTER_INTR(x) do { printk("qla2100 : Entering %s()\n", x); } while (0) ++#define LEAVE_INTR(x) do { printk("qla2100 : Leaving %s()\n", x); } while (0) ++#else ++#define ENTER(x) do {} while (0) ++#define LEAVE(x) do {} while (0) ++#define ENTER_INTR(x) do {} while (0) ++#define LEAVE_INTR(x) do {} while (0) ++#endif ++ ++#if DEBUG_QLA2100 ++#define DEBUG(x) do {x;} while (0); ++#else ++#define DEBUG(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_1) ++#define DEBUG1(x) do {x;} while (0); ++#else ++#define DEBUG1(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_2) ++#define DEBUG2(x) do {x;} while (0); ++#define DEBUG2_3(x) do {x;} while (0); ++#define DEBUG2_3_11(x) do {x;} while (0); ++#define DEBUG2_9_10(x) do {x;} while (0); ++#define DEBUG2_11(x) do {x;} while (0); ++#else ++#define DEBUG2(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_3) ++#define DEBUG3(x) do {x;} while (0); ++#define DEBUG2_3(x) do {x;} while (0); ++#define DEBUG2_3_11(x) do {x;} while (0); ++#define DEBUG3_11(x) do {x;} while (0); ++#else ++#define DEBUG3(x) do {} while (0); ++ #if !defined(QL_DEBUG_LEVEL_2) ++ #define DEBUG2_3(x) do {} while (0); ++ #endif ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_4) ++#define DEBUG4(x) do {x;} while (0); ++#else ++#define DEBUG4(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_5) ++#define DEBUG5(x) do {x;} while (0); ++#else ++#define DEBUG5(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_7) ++#define DEBUG7(x) do {x;} while (0); ++#else ++#define DEBUG7(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_9) ++#define DEBUG9(x) do {x;} while (0); ++#define DEBUG9_10(x) do {x;} while (0); ++#define DEBUG2_9_10(x) do {x;} while (0); ++#else ++#define DEBUG9(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_10) ++#define DEBUG10(x) do {x;} while (0); ++#define DEBUG2_9_10(x) do {x;} while (0); ++#define DEBUG9_10(x) do {x;} while (0); ++#else ++#define DEBUG10(x) do {} while (0); ++ #if !defined(DEBUG2_9_10) ++ #define DEBUG2_9_10(x) do {} while (0); ++ #endif ++ #if !defined(DEBUG9_10) ++ #define DEBUG9_10(x) do {} while (0); ++ #endif ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_11) ++#define DEBUG11(x) do{x;} while(0); ++#if !defined(DEBUG2_11) ++#define DEBUG2_11(x) do{x;} while(0); ++#endif ++#if !defined(DEBUG2_3_11) ++#define DEBUG2_3_11(x) do{x;} while(0); ++#endif ++#if !defined(DEBUG3_11) ++#define DEBUG3_11(x) do{x;} while(0); ++#endif ++#else ++#define DEBUG11(x) do{} while(0); ++ #if !defined(QL_DEBUG_LEVEL_2) ++ #define DEBUG2_11(x) do{} while(0); ++ #if !defined(QL_DEBUG_LEVEL_3) ++ #define DEBUG2_3_11(x) do{} while(0); ++ #endif ++ #endif ++ #if !defined(QL_DEBUG_LEVEL_3) ++ #define DEBUG3_11(x) do{} while(0); ++ #endif ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_12) ++#define DEBUG12(x) do {x;} while (0); ++#else ++#define DEBUG12(x) do {} while (0); ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_def.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,2484 @@ ++/******************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 Qlogic Corporation ++* (www.qlogic.com) ++* ++* 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. ++** ++******************************************************************************/ ++ ++#ifndef __QLA_DEF_H ++#define __QLA_DEF_H ++ ++#if defined(qla23xx) ++ #define MAILBOX_REGISTER_COUNT 32 ++ #define ISP_NAME "23xx" ++ #define DRIVER_NAME "qla2300" ++ #define ISP2300 ++ #undef ISP2322 ++#elif defined(qla22xx) ++ #define MAILBOX_REGISTER_COUNT 32 ++ #define ISP_NAME "22xx" ++ #define DRIVER_NAME "qla2200" ++ #define ISP2200 ++#else /* qla21xx */ ++ #define MAILBOX_REGISTER_COUNT 8 ++ #define ISP_NAME "21xx" ++ #define DRIVER_NAME "qla2100" ++ #define ISP2100 ++#endif ++ ++/*****************************************/ ++/* ISP Boards supported by this driver */ ++/*****************************************/ ++#define QLA2X00_VENDOR_ID 0x1077 ++ ++#define QLA2100_DEVICE_ID 0x2100 ++ ++#define QLA2200_DEVICE_ID 0x2200 ++#define QLA2200A_RISC_ROM_VER 4 ++ ++#define QLA2300_DEVICE_ID 0x2300 ++#define QLA2312_DEVICE_ID 0x2312 ++#define QLA2322_DEVICE_ID 0x2322 ++#define FPM_2300 6 ++#define FPM_2310 7 ++ ++#include "qla_settings.h" ++#include "exioct.h" ++#include "inioct.h" ++ ++/* ++ * Data bit definitions ++ */ ++#define BIT_0 0x1 ++#define BIT_1 0x2 ++#define BIT_2 0x4 ++#define BIT_3 0x8 ++#define BIT_4 0x10 ++#define BIT_5 0x20 ++#define BIT_6 0x40 ++#define BIT_7 0x80 ++#define BIT_8 0x100 ++#define BIT_9 0x200 ++#define BIT_10 0x400 ++#define BIT_11 0x800 ++#define BIT_12 0x1000 ++#define BIT_13 0x2000 ++#define BIT_14 0x4000 ++#define BIT_15 0x8000 ++#define BIT_16 0x10000 ++#define BIT_17 0x20000 ++#define BIT_18 0x40000 ++#define BIT_19 0x80000 ++#define BIT_20 0x100000 ++#define BIT_21 0x200000 ++#define BIT_22 0x400000 ++#define BIT_23 0x800000 ++#define BIT_24 0x1000000 ++#define BIT_25 0x2000000 ++#define BIT_26 0x4000000 ++#define BIT_27 0x8000000 ++#define BIT_28 0x10000000 ++#define BIT_29 0x20000000 ++#define BIT_30 0x40000000 ++#define BIT_31 0x80000000 ++ ++#define LSB(x) ((uint8_t)(x)) ++#define MSB(x) ((uint8_t)((uint16_t)(x) >> 8)) ++ ++#define LSW(x) ((uint16_t)(x)) ++#define MSW(x) ((uint16_t)((uint32_t)(x) >> 16)) ++ ++#define LSD(x) ((uint32_t)((uint64_t)(x))) ++#define MSD(x) ((uint32_t)((uint64_t)(x) >> 32)) ++ ++ ++/* ++ * I/O register ++*/ ++/* #define MEMORY_MAPPED_IO */ /* Enable memory mapped I/O */ ++#undef MEMORY_MAPPED_IO /* Disable memory mapped I/O */ ++ ++#if defined(MEMORY_MAPPED_IO) ++#define RD_REG_BYTE(addr) readb(addr) ++#define RD_REG_WORD(addr) readw(addr) ++#define RD_REG_DWORD(addr) readl(addr) ++#define WRT_REG_BYTE(addr, data) writeb(data,addr) ++#define WRT_REG_WORD(addr, data) writew(data,addr) ++#define WRT_REG_DWORD(addr, data) writel(data,addr) ++#else /* MEMORY_MAPPED_IO */ ++#define RD_REG_BYTE(addr) (inb((unsigned long)addr)) ++#define RD_REG_WORD(addr) (inw((unsigned long)addr)) ++#define RD_REG_DWORD(addr) (inl((unsigned long)addr)) ++#define WRT_REG_BYTE(addr, data) (outb(data,(unsigned long)addr)) ++#define WRT_REG_WORD(addr, data) (outw(data,(unsigned long)addr)) ++#define WRT_REG_DWORD(addr, data) (outl(data,(unsigned long)addr)) ++#endif /* MEMORY_MAPPED_IO */ ++ ++/* ++ * Fibre Channel device definitions. ++ */ ++#define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ ++#define MAX_FIBRE_DEVICES 256 ++#define MAX_FIBRE_LUNS 256 ++#define MAX_RSCN_COUNT 10 ++#define MAX_HOST_COUNT 16 ++ ++/* ++ * Host adapter default definitions. ++ */ ++#define MAX_BUSES 1 /* We only have one bus today */ ++#define MAX_TARGETS_2100 MAX_FIBRE_DEVICES ++#define MAX_TARGETS_2200 MAX_FIBRE_DEVICES ++#define MAX_TARGETS MAX_FIBRE_DEVICES ++#define MIN_LUNS 8 ++#define MAX_LUNS MAX_FIBRE_LUNS ++#define MAX_CMDS_PER_LUN 255 ++#define MAX_SRBS 4096 ++ ++/* ++ * Fibre Channel device definitions. ++ */ ++#define LAST_LOCAL_LOOP_ID 0x7d ++#define SNS_FL_PORT 0x7e ++#define FABRIC_CONTROLLER 0x7f ++#define SIMPLE_NAME_SERVER 0x80 ++#define SNS_FIRST_LOOP_ID 0x81 ++#define LAST_SNS_LOOP_ID 0xfe ++#define MANAGEMENT_SERVER 0xfe ++#define BROADCAST 0xff ++#define SNS_ACCEPT 0x0280 /* 8002 swapped */ ++#define SNS_REJECT 0x0180 /* 8001 swapped */ ++ ++/* Loop ID's used as database flags, must be higher than any valid Loop ID */ ++#define PORT_UNUSED 0x100 /* Port never been used. */ ++#define PORT_AVAILABLE 0x101 /* Device does not exist on port. */ ++#define PORT_NEED_MAP 0x102 ++#define PORT_LOST_ID 0x200 ++#define PORT_LOGIN_NEEDED 0x400 ++ ++/* ++ * Timeout timer counts in seconds ++ */ ++#define QLA2100_WDG_TIME_QUANTUM 5 /* In seconds */ ++#define PORT_RETRY_TIME 2 ++#define LOOP_DOWN_TIMEOUT 60 ++#define LOOP_DOWN_TIME 120 /* 240 */ ++#define LOOP_DOWN_RESET (LOOP_DOWN_TIME - 30) ++ ++/* Maximum outstanding commands in ISP queues (1-65535) */ ++#define MAX_OUTSTANDING_COMMANDS 1024 ++ ++/* ISP request and response entry counts (37-65535) */ ++#define REQUEST_ENTRY_CNT 1024 /* Number of request entries. */ ++#if defined(ISP2100) || defined(ISP2200) ++#define RESPONSE_ENTRY_CNT 64 /* Number of response entries.*/ ++#else ++#define RESPONSE_ENTRY_CNT 512 /* Number of response entries.*/ ++#endif ++ ++/* Number of segments 1 - 65535 */ ++#define SG_SEGMENTS 32 /* Cmd entry + 6 continuations */ ++ ++/* ++ * SCSI Request Block ++ */ ++typedef struct srb { ++ struct list_head list; ++ ++ Scsi_Cmnd *cmd; /* Linux SCSI command pkt */ ++ struct scsi_qla_host *ha; /* ha this SP is queued on */ ++ ++ uint8_t dir; /* direction of transfer */ ++ uint8_t unused1; ++ ++ uint16_t flags; /* Status flags - defined below */ ++ ++ uint16_t state; ++#define SRB_FREE_STATE 0 /* Request returned back */ ++#define SRB_PENDING_STATE 1 /* Request being queued in LUN Q */ ++#define SRB_ACTIVE_STATE 2 /* Request in Active Array */ ++#define SRB_DONE_STATE 3 /* Request Queued in Done Queue */ ++#define SRB_RETRY_STATE 4 /* Request in Retry Queue */ ++#define SRB_SUSPENDED_STATE 5 /* Request in suspended state */ ++#define SRB_NO_QUEUE_STATE 6 /* Request is in between states */ ++#define SRB_ACTIVE_TIMEOUT_STATE 7 /* Request in Active Array but timed out */ ++#define SRB_FAILOVER_STATE 8 /* Request in Failover Queue */ ++#define SRB_SCSI_RETRY_STATE 9 /* Request in Scsi Retry Queue */ ++ ++ uint8_t used; /* used by allocation code */ ++ uint8_t ref_num; /* reference SRB number */ ++ uint16_t magic; /* qlogic magic number */ ++#define SRB_MAGIC 0x10CB ++ ++ u_long host_no; /* Host number of allocating host */ ++ struct timer_list timer; /* used to timeout command */ ++ dma_addr_t saved_dma_handle; /* for unmap of single transfers */ ++ ++ atomic_t ref_count; /* reference count for this structure */ ++ ++ /* Target/LUN queue pointers. */ ++ struct os_tgt *tgt_queue; /* ptr to visible ha's target */ ++ struct os_lun *lun_queue; /* ptr to visible ha's lun */ ++ struct fc_lun *fclun; /* FC LUN context pointer. */ ++ ++ /* Raw completion info for use by failover ? */ ++ uint8_t fo_retry_cnt; /* Retry count this request */ ++ uint8_t err_id; /* error id */ ++ uint8_t cmd_length; /* command length */ ++ uint8_t unused3; ++ ++ int delay; /* delay in seconds */ ++ int ext_history; /* */ ++ ++ u_long e_start; /* jiffies at start of extend timeout */ ++ u_long r_start; /* jiffies at start of request */ ++ u_long u_start; /* jiffies when sent to F/W */ ++ u_long f_start; /* ra 10/29/01*/ ++ /*jiffies when put in failover queue*/ ++ ++ uint32_t resid; /* Residual transfer length */ ++ uint16_t sense_len; /* Sense data length */ ++ uint32_t request_sense_length; ++ void *request_sense_ptr; ++ ++#if defined(IOCB_THROLLE_USAGE) ++ uint32_t iocb_cnt; ++#endif ++} srb_t; ++ ++/* ++ * SRB flag definitions ++ */ ++#define SRB_TIMEOUT BIT_0 /* Command timed out */ ++#define SRB_DMA_VALID BIT_1 /* Command sent to ISP */ ++#define SRB_WATCHDOG BIT_2 /* Command on watchdog list */ ++#define SRB_ABORT_PENDING BIT_3 /* Command abort sent to device */ ++ ++#define SRB_ABORTED BIT_4 /* Command aborted command already */ ++#define SRB_RETRY BIT_5 /* Command needs retrying */ ++#define SRB_GOT_SENSE BIT_6 /* Command has sense data */ ++#define SRB_FAILOVER BIT_7 /* Command in failover state */ ++ ++#define SRB_BUSY BIT_8 /* Command is in busy retry state */ ++#define SRB_FO_CANCEL BIT_9 /* Command don't need to do failover */ ++#define SRB_IOCTL BIT_10 /* IOCTL command. */ ++#define SRB_ISP_STARTED BIT_11 /* Command sent to ISP. */ ++ ++#define SRB_ISP_COMPLETED BIT_12 /* ISP finished with command */ ++ ++ ++/* ++ * ISP PCI Configuration Register Set ++ */ ++typedef volatile struct { ++ uint16_t vendor_id; /* 0x0 */ ++ uint16_t device_id; /* 0x2 */ ++ uint16_t command; /* 0x4 */ ++ uint16_t status; /* 0x6 */ ++ uint8_t revision_id; /* 0x8 */ ++ uint8_t programming_interface; /* 0x9 */ ++ uint8_t sub_class; /* 0xa */ ++ uint8_t base_class; /* 0xb */ ++ uint8_t cache_line; /* 0xc */ ++ uint8_t latency_timer; /* 0xd */ ++ uint8_t header_type; /* 0xe */ ++ uint8_t bist; /* 0xf */ ++ uint32_t base_port; /* 0x10 */ ++ uint32_t mem_base_addr; /* 0x14 */ ++ uint32_t base_addr[4]; /* 0x18-0x24 */ ++ uint32_t reserved_1[2]; /* 0x28-0x2c */ ++ uint16_t expansion_rom; /* 0x30 */ ++ uint32_t reserved_2[2]; /* 0x34-0x38 */ ++ uint8_t interrupt_line; /* 0x3c */ ++ uint8_t interrupt_pin; /* 0x3d */ ++ uint8_t min_grant; /* 0x3e */ ++ uint8_t max_latency; /* 0x3f */ ++} config_reg_t __attribute__((packed)); ++ ++ ++/* ++ * ISP I/O Register Set structure definitions. ++ */ ++typedef volatile struct { ++ volatile uint16_t flash_address; /* Flash BIOS address */ ++ volatile uint16_t flash_data; /* Flash BIOS data */ ++ uint16_t unused_1[1]; /* Gap */ ++ volatile uint16_t ctrl_status; /* Control/Status */ ++#define CSR_FLASH_64K_BANK BIT_3 /* Flash upper 64K bank select */ ++#define CSR_FLASH_ENABLE BIT_1 /* Flash BIOS Read/Write enable */ ++#define CSR_ISP_SOFT_RESET BIT_0 /* ISP soft reset */ ++ ++ volatile uint16_t ictrl; /* Interrupt control */ ++#define ICR_EN_INT BIT_15 /* ISP enable interrupts. */ ++#define ICR_EN_RISC BIT_3 /* ISP enable RISC interrupts. */ ++ ++ volatile uint16_t istatus; /* Interrupt status */ ++#define ISR_RISC_INT BIT_3 /* RISC interrupt */ ++ ++ volatile uint16_t semaphore; /* Semaphore */ ++ volatile uint16_t nvram; /* NVRAM register. */ ++#define NVR_DESELECT 0 ++#define NVR_CLOCK BIT_0 ++#define NVR_SELECT BIT_1 ++#define NVR_DATA_OUT BIT_2 ++#define NVR_DATA_IN BIT_3 ++#define NVR_BUSY BIT_15 ++ ++#if defined(ISP2100) || defined(ISP2200) ++ volatile uint16_t mailbox0; ++ volatile uint16_t mailbox1; ++ volatile uint16_t mailbox2; ++ volatile uint16_t mailbox3; ++ volatile uint16_t mailbox4; ++#define ISP_REQ_Q_IN(reg) (&(reg)->mailbox4) ++#define ISP_REQ_Q_OUT(reg) (&(reg)->mailbox4) ++ volatile uint16_t mailbox5; ++#define ISP_RSP_Q_IN(reg) (&(reg)->mailbox5) ++#define ISP_RSP_Q_OUT(reg) (&(reg)->mailbox5) ++ volatile uint16_t mailbox6; ++ volatile uint16_t mailbox7; ++ uint16_t unused_2[0x3b]; /* Gap */ ++#else /* defined(ISP2300) */ ++ volatile uint16_t req_q_in; /* Request Queue In-Pointer */ ++#define ISP_REQ_Q_IN(reg) (&(reg)->req_q_in) ++ volatile uint16_t req_q_out; /* Request Queue Out-Pointer */ ++#define ISP_REQ_Q_OUT(reg) (&(reg)->req_q_out) ++ volatile uint16_t rsp_q_in; /* Response Queue In-Pointer */ ++#define ISP_RSP_Q_IN(reg) (&(reg)->rsp_q_in) ++ volatile uint16_t rsp_q_out; /* Response Queue Out-Pointer */ ++#define ISP_RSP_Q_OUT(reg) (&(reg)->rsp_q_out) ++ ++ volatile uint16_t host_status_lo; /* RISC to Host Status Low */ ++#define HSR_INT BIT_15 /* RISC int */ ++#define HSR_RISC_PAUSED BIT_8 /* RISC Paused */ ++ volatile uint16_t host_status_hi; /* RISC to Host Status High */ ++#define HSR_ROM_MB_CMD_COMP 0x01 /* ROM mailbox cmd complete */ ++#define HSR_ROM_MB_CMD_ERROR 0x02 /*ROM mailbox cmd unsuccessful*/ ++#define HSR_MB_CMD_COMP 0x10 /* Mailbox cmd complete */ ++#define HSR_MB_CMD_ERROR 0x11 /* Mailbox cmd unsuccessful */ ++#define HSR_ASYNC_EVENT 0x12 /* Asynchronous event */ ++#define HSR_RESPONSE_QUEUE_UP 0x13 /* Response Queue update */ ++#define HSR_RIO_ONE 0x15 /* RIO one 16 bit handle */ ++#define HSR_FAST_SCSI_COMP 0x16 /* Fast Post SCSI complete */ ++ ++ volatile uint16_t host_semaphore; /* Host to Host Semaphore */ ++ uint16_t unused_3[0x11]; /* Gap */ ++ volatile uint16_t mailbox0; ++ volatile uint16_t mailbox1; ++ volatile uint16_t mailbox2; ++ volatile uint16_t mailbox3; ++ volatile uint16_t mailbox4; ++ volatile uint16_t mailbox5; ++ volatile uint16_t mailbox6; ++ volatile uint16_t mailbox7; ++ volatile uint16_t mailbox8; ++ volatile uint16_t mailbox9; ++ volatile uint16_t mailbox10; ++ volatile uint16_t mailbox11; ++ volatile uint16_t mailbox12; ++ volatile uint16_t mailbox13; ++ volatile uint16_t mailbox14; ++ volatile uint16_t mailbox15; ++ volatile uint16_t mailbox16; ++ volatile uint16_t mailbox17; ++ volatile uint16_t mailbox18; ++ volatile uint16_t mailbox19; ++ volatile uint16_t mailbox20; ++ volatile uint16_t mailbox21; ++ volatile uint16_t mailbox22; ++ volatile uint16_t mailbox23; ++ volatile uint16_t mailbox24; ++ volatile uint16_t mailbox25; ++ volatile uint16_t mailbox26; ++ volatile uint16_t mailbox27; ++ volatile uint16_t mailbox28; ++ volatile uint16_t mailbox29; ++ volatile uint16_t mailbox30; ++ volatile uint16_t mailbox31; ++ volatile uint16_t fb_cmd; ++ uint16_t unused_4[0xa]; /* Gap */ ++#endif /* defined(ISP2100) || defined(ISP2200) */ ++ volatile uint16_t fpm_diag_config; ++ uint16_t unused_5[0x6]; /* Gap */ ++ volatile uint16_t pcr; /* Processor Control Register. */ ++ uint16_t unused_6[0x5]; /* Gap */ ++ volatile uint16_t mctr; /* Memory Configuration and Timing. */ ++ uint16_t unused_7[0x3]; /* Gap */ ++#if defined(ISP2100) || defined(ISP2200) ++ volatile uint16_t fb_cmd; ++#else /* defined(ISP2300) */ ++ uint16_t unused_11; ++#endif /* defined(ISP2100) || defined(ISP2200) */ ++ uint16_t unused_8[0x3]; /* Gap */ ++ volatile uint16_t hccr; /* Host command & control register. */ ++#define HCCR_HOST_INT BIT_7 /* Host interrupt bit */ ++#define HCCR_RISC_PAUSE BIT_5 /* Pause mode bit */ ++ /* HCCR commands */ ++#define HCCR_RESET_RISC 0x1000 /* Reset RISC */ ++#define HCCR_PAUSE_RISC 0x2000 /* Pause RISC */ ++#define HCCR_RELEASE_RISC 0x3000 /* Release RISC from reset. */ ++#define HCCR_SET_HOST_INT 0x5000 /* Set host interrupt */ ++#define HCCR_CLR_HOST_INT 0x6000 /* Clear HOST interrupt */ ++#define HCCR_CLR_RISC_INT 0x7000 /* Clear RISC interrupt */ ++#define HCCR_DISABLE_PARITY_PAUSE 0x4001 /* Disable parity error RISC pause. */ ++#define HCCR_ENABLE_PARITY 0xA000 /* Enable PARITY interrupt */ ++ ++ uint16_t unused_9[5]; /* Gap */ ++ volatile uint16_t gpiod; /* GPIO Data register. */ ++ volatile uint16_t gpioe; /* GPIO Enable register. */ ++#if defined(ISP2200) ++ uint16_t unused_10[8]; /* Gap */ ++ volatile uint16_t mailbox8; ++ volatile uint16_t mailbox9; ++ volatile uint16_t mailbox10; ++ volatile uint16_t mailbox11; ++ volatile uint16_t mailbox12; ++ volatile uint16_t mailbox13; ++ volatile uint16_t mailbox14; ++ volatile uint16_t mailbox15; ++ volatile uint16_t mailbox16; ++ volatile uint16_t mailbox17; ++ volatile uint16_t mailbox18; ++ volatile uint16_t mailbox19; ++ volatile uint16_t mailbox20; ++ volatile uint16_t mailbox21; ++ volatile uint16_t mailbox22; ++ volatile uint16_t mailbox23; /* Also probe reg. */ ++#endif /* defined(ISP2200) */ ++} device_reg_t; ++ ++typedef struct { ++ uint32_t out_mb; /* outbound from driver */ ++ uint32_t in_mb; /* Incoming from RISC */ ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ long buf_size; ++ void *bufp; ++ uint32_t tov; ++ uint8_t flags; ++#define MBX_DMA_IN BIT_0 ++#define MBX_DMA_OUT BIT_1 ++#define IOCTL_CMD BIT_2 ++} mbx_cmd_t; ++ ++#define MBX_TOV_SECONDS 30 ++ ++/* ++ * ISP product identification definitions in mailboxes after reset. ++ */ ++#define PROD_ID_1 0x4953 ++#define PROD_ID_2 0x0000 ++#define PROD_ID_2a 0x5020 ++#define PROD_ID_3 0x2020 ++#define PROD_ID_4 0x1 ++#define PROD_ID_4a 0x2 ++ ++/* ++ * ISP mailbox Self-Test status codes ++ */ ++#define MBS_FRM_ALIVE 0 /* Firmware Alive. */ ++#define MBS_CHKSUM_ERR 1 /* Checksum Error. */ ++#define MBS_BUSY 4 /* Busy. */ ++ ++/* ++ * ISP mailbox command complete status codes ++ */ ++#define MBS_CMD_CMP 0x4000 /* Command Complete. */ ++#define MBS_INV_CMD 0x4001 /* Invalid Command. */ ++#define MBS_HOST_INF_ERR 0x4002 /* Host Interface Error. */ ++#define MBS_TEST_FAILED 0x4003 /* Test Failed. */ ++#define MBS_CMD_ERR 0x4005 /* Command Error. */ ++#define MBS_CMD_PARAM_ERR 0x4006 /* Command Parameter Error. */ ++#define MBS_FATAL_ERROR 0xF000 /* Command Fatal Error. */ ++//TODO consolidate these definitions ++#define MBS_FIRMWARE_ALIVE 0x0000 ++#define MBS_COMMAND_COMPLETE 0x4000 ++#define MBS_INVALID_COMMAND 0x4001 ++ ++/* QLogic subroutine status definitions */ ++#define QL_STATUS_SUCCESS 0 ++#define QL_STATUS_ERROR 1 ++#define QL_STATUS_FATAL_ERROR 2 ++#define QL_STATUS_RESOURCE_ERROR 3 ++#define QL_STATUS_LOOP_ID_IN_USE 4 ++#define QL_STATUS_NO_DATA 5 ++#define QL_STATUS_TIMEOUT 6 ++/* ++ * ISP mailbox asynchronous event status codes ++ */ ++#define MBA_ASYNC_EVENT 0x8000 /* Asynchronous event. */ ++#define MBA_RESET 0x8001 /* Reset Detected. */ ++#define MBA_SYSTEM_ERR 0x8002 /* System Error. */ ++#define MBA_REQ_TRANSFER_ERR 0x8003 /* Request Transfer Error. */ ++#define MBA_RSP_TRANSFER_ERR 0x8004 /* Response Transfer Error. */ ++#define MBA_WAKEUP_THRES 0x8005 /* Request Queue Wake-up. */ ++#define MBA_LIP_OCCURRED 0x8010 /* Loop Initialization Procedure */ ++ /* occurred. */ ++#define MBA_LOOP_UP 0x8011 /* FC Loop UP. */ ++#define MBA_LOOP_DOWN 0x8012 /* FC Loop Down. */ ++#define MBA_LIP_RESET 0x8013 /* LIP reset occurred. */ ++#define MBA_PORT_UPDATE 0x8014 /* Port Database update. */ ++#define MBA_SCR_UPDATE 0x8015 /* State Change Registration. */ ++#define MBA_RSCN_UPDATE MBA_SCR_UPDATE ++#define MBA_SCSI_COMPLETION 0x8020 /* SCSI Command Complete. */ ++#define MBA_CTIO_COMPLETION 0x8021 /* CTIO Complete. */ ++#if !defined(ISP2100) ++#define MBA_LINK_MODE_UP 0x8030 /* FC Link Mode UP. */ ++#define MBA_UPDATE_CONFIG 0x8036 /* FC Update Configuration. */ ++#endif ++ ++/* ++ * ISP mailbox commands ++ */ ++#define MBC_LOAD_RAM 1 /* Load RAM. */ ++#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */ ++#define MBC_WRITE_RAM_WORD 4 /* Write RAM word. */ ++#define MBC_READ_RAM_WORD 5 /* Read RAM word. */ ++#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ ++#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */ ++#define MBC_ABOUT_FIRMWARE 8 /* Get firmware revision. */ ++#define MBC_LOAD_RAM_A64 9 /* Load RAM by 64-bit address. */ ++#define MBC_DUMP_RAM 0xA /* READ BACK FW */ ++#define MBC_LOAD_RAM_EXTENDED 0xB /* Load Extended RAM */ ++#define MBC_DUMP_SRAM 0xC /* Dump SRAM */ ++#define MBC_WRITE_RAM_WORD_EXTENDED 0xD /* Write RAM word extended */ ++#define MBC_IOCB_EXECUTE 0x12 /* Execute an IOCB command */ ++#define MBC_ABORT_COMMAND 0x15 /* Abort IOCB command. */ ++#define MBC_ABORT_DEVICE 0x16 /* Abort device (ID/LUN). */ ++#define MBC_ABORT_TARGET 0x17 /* Abort target (ID). */ ++#define MBC_TARGET_RESET_ALL 0x18 /* Reset all local targets. */ ++#define MBC_GET_ADAPTER_LOOP_ID 0x20 /* Get loop id of ISP2100. */ ++#define MBC_GET_RETRY_COUNT 0x22 /* GET RATOV & retry count */ ++#define MBC_GET_FIRMWARE_OPTIONS 0x28 /* Get firmware options. */ ++#define MBC_SET_RETRY_COUNT 0x32 /* SET RATOV & retry count. */ ++#define MBC_SET_FIRMWARE_OPTIONS 0x38 /* Set firmware options. */ ++#define MBC_GET_RESOURCE_COUNTS 0x42 /* GET Resource counts */ ++#define MBC_DIAGNOSTIC_LOOP_BACK 0x45 /* Perform LoopBack diagnostic */ ++#define MBC_ENHANCED_GET_PORT_DATABASE 0x47 /* Get port database. */ ++#define MBC_IOCB_EXECUTE_A64 0x54 /* Execute an IOCB command (64bit) */ ++#define MBC_SEND_RNID_ELS 0x57 /* Send RNID ELS request */ ++#define MBC_SET_RNID_PARAMS 0x59 /* Set RNID parameters */ ++#define MBC_GET_RNID_PARAMS 0x5a /* Get RNID parameters */ ++#define MBC_INITIALIZE_FIRMWARE 0x60 /* Initialize firmware */ ++#define MBC_INITIATE_LIP 0x62 /* Initiate Loop Initialization */ ++ /* Procedure */ ++#define MBC_GET_FCAL_MAP 0x63 /* Get FC/AL position map */ ++#define MBC_GET_PORT_DATABASE 0x64 /* Get port database. */ ++#define MBC_TARGET_RESET 0x66 /* Target reset. */ ++#define MBC_GET_FIRMWARE_STATE 0x69 /* Get firmware state. */ ++#define MBC_GET_PORT_NAME 0x6a /* Get port name. */ ++#define MBC_GET_LINK_STATUS 0x6b /* Get link status. */ ++#define MBC_LIP_RESET 0x6c /* LIP reset. */ ++#define MBC_SEND_SNS_COMMAND 0x6e /* Send Simple Name Server command. */ ++#define MBC_LOGIN_FABRIC_PORT 0x6f /* Login fabric port. */ ++#define MBC_LOGOUT_FABRIC_PORT 0x71 /* Logout fabric port. */ ++#define MBC_LIP_FULL_LOGIN 0x72 /* Full login LIP. */ ++#define MBC_LOGIN_LOOP_PORT 0x74 /* Login Loop Port. */ ++#define MBC_GET_PORT_LIST 0x75 /* Get port list. */ ++#define MBC_INITIALIZE_RECEIVE_QUEUE 0x77 /* Initialize receive queue */ ++#define MBC_SEND_FARP_REQ_COMMAND 0x78 /* FARP request. */ ++#define MBC_SEND_FARP_REPLY_COMMAND 0x79 /* FARP reply. */ ++#define MBC_PORT_LOOP_NAME_LIST 0x7C /* Get port/node name list. */ ++#define MBC_SEND_LFA_COMMAND 0x7D /* Send Loop Fabric Address */ ++#define MBC_LUN_RESET 0x7E /* Send LUN reset */ ++ ++/* Firmware return data sizes */ ++#define FCAL_MAP_SIZE 128 ++ ++/* Mailbox bit definitions for out_mb and in_mb */ ++#define MBX_31 BIT_31 ++#define MBX_30 BIT_30 ++#define MBX_29 BIT_29 ++#define MBX_28 BIT_28 ++#define MBX_27 BIT_27 ++#define MBX_26 BIT_26 ++#define MBX_25 BIT_25 ++#define MBX_24 BIT_24 ++#define MBX_23 BIT_23 ++#define MBX_22 BIT_22 ++#define MBX_21 BIT_21 ++#define MBX_20 BIT_20 ++#define MBX_19 BIT_19 ++#define MBX_18 BIT_18 ++#define MBX_17 BIT_17 ++#define MBX_16 BIT_16 ++#define MBX_15 BIT_15 ++#define MBX_14 BIT_14 ++#define MBX_13 BIT_13 ++#define MBX_12 BIT_12 ++#define MBX_11 BIT_11 ++#define MBX_10 BIT_10 ++#define MBX_9 BIT_9 ++#define MBX_8 BIT_8 ++#define MBX_7 BIT_7 ++#define MBX_6 BIT_6 ++#define MBX_5 BIT_5 ++#define MBX_4 BIT_4 ++#define MBX_3 BIT_3 ++#define MBX_2 BIT_2 ++#define MBX_1 BIT_1 ++#define MBX_0 BIT_0 ++ ++/* ++ * Firmware state codes from get firmware state mailbox command ++ */ ++#define FSTATE_CONFIG_WAIT 0 ++#define FSTATE_WAIT_AL_PA 1 ++#define FSTATE_WAIT_LOGIN 2 ++#define FSTATE_READY 3 ++#define FSTATE_LOSS_OF_SYNC 4 ++#define FSTATE_ERROR 5 ++#define FSTATE_REINIT 6 ++#define FSTATE_NON_PART 7 ++ ++#define FSTATE_CONFIG_CORRECT 0 ++#define FSTATE_P2P_RCV_LIP 1 ++#define FSTATE_P2P_CHOOSE_LOOP 2 ++#define FSTATE_P2P_RCV_UNIDEN_LIP 3 ++#define FSTATE_FATAL_ERROR 4 ++#define FSTATE_LOOP_BACK_CONN 5 ++ ++/* ++ * Port Database structure definition ++ * Little endian except where noted. ++ */ ++#define PORT_DATABASE_SIZE 128 /* bytes */ ++typedef struct { ++ uint8_t options; ++ uint8_t control; ++ uint8_t master_state; ++ uint8_t slave_state; ++#define PD_STATE_DISCOVERY 0 ++#define PD_STATE_WAIT_DISCOVERY_ACK 1 ++#define PD_STATE_PORT_LOGIN 2 ++#define PD_STATE_WAIT_PORT_LOGIN_ACK 3 ++#define PD_STATE_PROCESS_LOGIN 4 ++#define PD_STATE_WAIT_PROCESS_LOGIN_ACK 5 ++#define PD_STATE_PORT_LOGGED_IN 6 ++#define PD_STATE_PORT_UNAVAILABLE 7 ++#define PD_STATE_PROCESS_LOGOUT 8 ++#define PD_STATE_WAIT_PROCESS_LOGOUT_ACK 9 ++#define PD_STATE_PORT_LOGOUT 10 ++#define PD_STATE_WAIT_PORT_LOGOUT_ACK 11 ++ uint8_t reserved[2]; ++ uint8_t hard_address; ++ uint8_t reserved_1; ++ uint8_t port_id[4]; ++ uint8_t node_name[8]; /* Big endian. */ ++ uint8_t port_name[8]; /* Big endian. */ ++ uint16_t execution_throttle; ++ uint16_t execution_count; ++ uint8_t reset_count; ++ uint8_t reserved_2; ++ uint16_t resource_allocation; ++ uint16_t current_allocation; ++ uint16_t queue_head; ++ uint16_t queue_tail; ++ uint16_t transmit_execution_list_next; ++ uint16_t transmit_execution_list_previous; ++ uint16_t common_features; ++ uint16_t total_concurrent_sequences; ++ uint16_t RO_by_information_category; ++ uint8_t recipient; ++ uint8_t initiator; ++ uint16_t receive_data_size; ++ uint16_t concurrent_sequences; ++ uint16_t open_sequences_per_exchange; ++ uint16_t lun_abort_flags; ++ uint16_t lun_stop_flags; ++ uint16_t stop_queue_head; ++ uint16_t stop_queue_tail; ++ uint16_t port_retry_timer; ++ uint16_t next_sequence_id; ++ uint16_t frame_count; ++ uint16_t PRLI_payload_length; ++ uint8_t prli_svc_param_word_0[2]; /* Big endian */ ++ /* Bits 15-0 of word 0 */ ++ uint8_t prli_svc_param_word_3[2]; /* Big endian */ ++ /* Bits 15-0 of word 3 */ ++ uint16_t loop_id; ++ uint16_t extended_lun_info_list_pointer; ++ uint16_t extended_lun_stop_list_pointer; ++} port_database_t; ++ ++/* ++ * ISP Initialization Control Block. ++ */ ++ ++#define SO_DATA_RATE_1GB 0 ++#define SO_DATA_RATE_2GB 1 ++#define SO_DATA_RATE_AUTO 2 ++ ++/* ++ * ISP Initialization Control Block. ++ * Little endian except where noted. ++ */ ++#define ICB_VERSION 1 ++typedef struct { ++ uint8_t version; ++ uint8_t reserved_1; ++ ++ /* ++ * LSB BIT 0 = Enable Hard Loop Id ++ * LSB BIT 1 = Enable Fairness ++ * LSB BIT 2 = Enable Full-Duplex ++ * LSB BIT 3 = Enable Fast Posting ++ * LSB BIT 4 = Enable Target Mode ++ * LSB BIT 5 = Disable Initiator Mode ++ * LSB BIT 6 = Enable ADISC ++ * LSB BIT 7 = Enable Target Inquiry Data ++ * ++ * MSB BIT 0 = Enable PDBC Notify ++ * MSB BIT 1 = Non Participating LIP ++ * MSB BIT 2 = Descending Loop ID Search ++ * MSB BIT 3 = Acquire Loop ID in LIPA ++ * MSB BIT 4 = Stop PortQ on Full Status ++ * MSB BIT 5 = Full Login after LIP ++ * MSB BIT 6 = Node Name Option ++ * MSB BIT 7 = Ext IFWCB enable bit ++ */ ++ uint8_t firmware_options[2]; ++ ++ uint16_t frame_payload_size; ++ uint16_t max_iocb_allocation; ++ uint16_t execution_throttle; ++ uint8_t retry_count; ++ uint8_t retry_delay; /* unused */ ++ uint8_t port_name[WWN_SIZE]; /* Big endian. */ ++ uint16_t hard_address; ++ uint8_t inquiry_data; ++ uint8_t login_timeout; ++ uint8_t node_name[WWN_SIZE]; /* Big endian. */ ++ ++ uint16_t request_q_outpointer; ++ uint16_t response_q_inpointer; ++ uint16_t request_q_length; ++ uint16_t response_q_length; ++ uint32_t request_q_address[2]; ++ uint32_t response_q_address[2]; ++ ++ uint16_t lun_enables; ++ uint8_t command_resource_count; ++ uint8_t immediate_notify_resource_count; ++ uint16_t timeout; ++ uint8_t reserved_2[2]; ++ ++ /* ++ * LSB BIT 0 = Timer Operation mode bit 0 ++ * LSB BIT 1 = Timer Operation mode bit 1 ++ * LSB BIT 2 = Timer Operation mode bit 2 ++ * LSB BIT 3 = Timer Operation mode bit 3 ++ * LSB BIT 4 = Init Config Mode bit 0 ++ * LSB BIT 5 = Init Config Mode bit 1 ++ * LSB BIT 6 = Init Config Mode bit 2 ++ * LSB BIT 7 = Enable Non part on LIHA failure ++ * ++ * MSB BIT 0 = Enable class 2 ++ * MSB BIT 1 = Enable ACK0 ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = FC Tape Enable ++ * MSB BIT 5 = Enable FC Confirm ++ * MSB BIT 6 = Enable command queuing in target mode ++ * MSB BIT 7 = No Logo On Link Down ++ */ ++ uint8_t add_firmware_options[2]; ++ ++ uint8_t response_accumulation_timer; ++ uint8_t interrupt_delay_timer; ++ ++ /* ++ * LSB BIT 0 = Enable Read xfr_rdy ++ * LSB BIT 1 = Soft ID only ++ * LSB BIT 2 = ++ * LSB BIT 3 = ++ * LSB BIT 4 = FCP RSP Payload [0] ++ * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200 ++ * LSB BIT 6 = Enable Out-of-Order frame handling ++ * LSB BIT 7 = Disable Automatic PLOGI on Local Loop ++ * ++ * MSB BIT 0 = Sbus enable - 2300 ++ * MSB BIT 1 = ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = enable 50 ohm termination ++ * MSB BIT 6 = Data Rate (2300 only) ++ * MSB BIT 7 = Data Rate (2300 only) ++ */ ++ uint8_t special_options[2]; ++ ++ uint8_t reserved_3[26]; ++} init_cb_t; ++ ++/* ++ * ISP Get/Set Target Parameters mailbox command control flags. ++ */ ++ ++/* ++ * Get Link Status mailbox command return buffer. ++ */ ++typedef struct { ++ uint32_t link_fail_cnt; ++ uint32_t loss_sync_cnt; ++ uint32_t loss_sig_cnt; ++ uint32_t prim_seq_err_cnt; ++ uint32_t inval_xmit_word_cnt; ++ uint32_t inval_crc_cnt; ++} link_stat_t; ++ ++/* ++ * NVRAM Command values. ++ */ ++#define NV_START_BIT BIT_2 ++#define NV_WRITE_OP (BIT_26+BIT_24) ++#define NV_READ_OP (BIT_26+BIT_25) ++#define NV_ERASE_OP (BIT_26+BIT_25+BIT_24) ++#define NV_MASK_OP (BIT_26+BIT_25+BIT_24) ++#define NV_DELAY_COUNT 10 ++ ++/* ++ * QLogic ISP2100, ISP2200 and ISP2300 NVRAM structure definition. ++ */ ++typedef struct { ++ /* ++ * NVRAM header ++ */ ++ uint8_t id[4]; ++ uint8_t nvram_version; ++ uint8_t reserved_0; ++ ++ /* ++ * NVRAM RISC parameter block ++ */ ++ uint8_t parameter_block_version; ++ uint8_t reserved_1; ++ ++ /* ++ * LSB BIT 0 = Enable Hard Loop Id ++ * LSB BIT 1 = Enable Fairness ++ * LSB BIT 2 = Enable Full-Duplex ++ * LSB BIT 3 = Enable Fast Posting ++ * LSB BIT 4 = Enable Target Mode ++ * LSB BIT 5 = Disable Initiator Mode ++ * LSB BIT 6 = Enable ADISC ++ * LSB BIT 7 = Enable Target Inquiry Data ++ * ++ * MSB BIT 0 = Enable PDBC Notify ++ * MSB BIT 1 = Non Participating LIP ++ * MSB BIT 2 = Descending Loop ID Search ++ * MSB BIT 3 = Acquire Loop ID in LIPA ++ * MSB BIT 4 = Stop PortQ on Full Status ++ * MSB BIT 5 = Full Login after LIP ++ * MSB BIT 6 = Node Name Option ++ * MSB BIT 7 = Ext IFWCB enable bit ++ */ ++ uint8_t firmware_options[2]; ++ ++ uint16_t frame_payload_size; ++ uint16_t max_iocb_allocation; ++ uint16_t execution_throttle; ++ uint8_t retry_count; ++ uint8_t retry_delay; /* unused */ ++ uint8_t port_name[WWN_SIZE]; /* Big endian. */ ++ uint16_t hard_address; ++ uint8_t inquiry_data; ++ uint8_t login_timeout; ++ uint8_t node_name[WWN_SIZE]; /* Big endian. */ ++ ++ /* ++ * LSB BIT 0 = Timer Operation mode bit 0 ++ * LSB BIT 1 = Timer Operation mode bit 1 ++ * LSB BIT 2 = Timer Operation mode bit 2 ++ * LSB BIT 3 = Timer Operation mode bit 3 ++ * LSB BIT 4 = Init Config Mode bit 0 ++ * LSB BIT 5 = Init Config Mode bit 1 ++ * LSB BIT 6 = Init Config Mode bit 2 ++ * LSB BIT 7 = Enable Non part on LIHA failure ++ * ++ * MSB BIT 0 = Enable class 2 ++ * MSB BIT 1 = Enable ACK0 ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = FC Tape Enable ++ * MSB BIT 5 = Enable FC Confirm ++ * MSB BIT 6 = Enable command queuing in target mode ++ * MSB BIT 7 = No Logo On Link Down ++ */ ++ uint8_t add_firmware_options[2]; ++ ++ uint8_t response_accumulation_timer; ++ uint8_t interrupt_delay_timer; ++ ++ /* ++ * LSB BIT 0 = Enable Read xfr_rdy ++ * LSB BIT 1 = Soft ID only ++ * LSB BIT 2 = ++ * LSB BIT 3 = ++ * LSB BIT 4 = FCP RSP Payload [0] ++ * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200 ++ * LSB BIT 6 = Enable Out-of-Order frame handling ++ * LSB BIT 7 = Disable Automatic PLOGI on Local Loop ++ * ++ * MSB BIT 0 = Sbus enable - 2300 ++ * MSB BIT 1 = ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = enable 50 ohm termination ++ * MSB BIT 6 = Data Rate (2300 only) ++ * MSB BIT 7 = Data Rate (2300 only) ++ */ ++ uint8_t special_options[2]; ++ ++ /* Reserved for expanded RISC parameter block */ ++ uint8_t reserved_2[24]; ++ ++ /* ++ * LSB BIT 0 = Output Swing 1G bit 0 ++ * LSB BIT 1 = Output Swing 1G bit 1 ++ * LSB BIT 2 = Output Swing 1G bit 2 ++ * LSB BIT 3 = Output Emphasis 1G bit 0 ++ * LSB BIT 4 = Output Emphasis 1G bit 1 ++ * LSB BIT 5 = Output Swing 2G bit 0 ++ * LSB BIT 6 = Output Swing 2G bit 1 ++ * LSB BIT 7 = Output Swing 2G bit 2 ++ * ++ * MSB BIT 0 = Output Emphasis 2G bit 0 ++ * MSB BIT 1 = Output Emphasis 2G bit 1 ++ * MSB BIT 2 = Output Enable ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = ++ * MSB BIT 6 = ++ * MSB BIT 7 = ++ */ ++ uint8_t seriallink_options[2]; ++ ++ /* ++ * NVRAM host parameter block ++ * ++ * LSB BIT 0 = Enable spinup delay ++ * LSB BIT 1 = Disable BIOS ++ * LSB BIT 2 = Enable Memory Map BIOS ++ * LSB BIT 3 = Enable Selectable Boot ++ * LSB BIT 4 = Disable RISC code load ++ * LSB BIT 5 = Set cache line size 1 ++ * LSB BIT 6 = PCI Parity Disable ++ * LSB BIT 7 = Enable extended logging ++ * ++ * MSB BIT 0 = Enable 64bit addressing ++ * MSB BIT 1 = Enable lip reset ++ * MSB BIT 2 = Enable lip full login ++ * MSB BIT 3 = Enable target reset ++ * MSB BIT 4 = Enable database storage ++ * MSB BIT 5 = Enable cache flush read ++ * MSB BIT 6 = Enable database load ++ * MSB BIT 7 = Enable alternate WWN ++ */ ++ uint8_t host_p[2]; ++ ++ uint8_t boot_node_name[WWN_SIZE]; ++ uint8_t boot_lun_number; ++ uint8_t reset_delay; ++ uint8_t port_down_retry_count; ++ uint8_t boot_id_number; ++ uint16_t max_luns_per_target; ++ uint8_t fcode_boot_port_name[WWN_SIZE]; ++ uint8_t alternate_port_name[WWN_SIZE]; ++ uint8_t alternate_node_name[WWN_SIZE]; ++ ++ /* ++ * BIT 0 = Boot Zoning ++ * BIT 1 = Alt-Boot Enable ++ * BIT 2 = Report SCSI Path ++ * BIT 3 = unused ++ * BIT 4 = unused ++ * BIT 5 = unused ++ * BIT 6 = unused ++ * BIT 7 = unused ++ */ ++ uint8_t efi_parameters; ++ ++ uint8_t link_down_timeout; ++ ++ uint8_t adapter_id_0[4]; ++ uint8_t adapter_id_1[4]; ++ uint8_t adapter_id_2[4]; ++ uint8_t adapter_id_3[4]; ++ ++ uint8_t alt1_boot_node_name[WWN_SIZE]; ++ uint16_t alt1_boot_lun_number; ++ uint8_t alt2_boot_node_name[WWN_SIZE]; ++ uint16_t alt2_boot_lun_number; ++ uint8_t alt3_boot_node_name[WWN_SIZE]; ++ uint16_t alt3_boot_lun_number; ++ uint8_t alt4_boot_node_name[WWN_SIZE]; ++ uint16_t alt4_boot_lun_number; ++ uint8_t alt5_boot_node_name[WWN_SIZE]; ++ uint16_t alt5_boot_lun_number; ++ uint8_t alt6_boot_node_name[WWN_SIZE]; ++ uint16_t alt6_boot_lun_number; ++ uint8_t alt7_boot_node_name[WWN_SIZE]; ++ uint16_t alt7_boot_lun_number; ++ ++ uint8_t reserved_3[2]; ++ ++ uint8_t oem_id; ++ uint8_t oem_specific[31]; ++ ++ /* ++ * NVRAM Adapter Features offset 232-239 ++ * ++ * LSB BIT 0 = External GBIC ++ * LSB BIT 1 = Risc RAM parity ++ * LSB BIT 2 = Buffer Plus Module ++ * LSB BIT 3 = Multi Chip Adapter ++ * LSB BIT 4 = Internal connector ++ * LSB BIT 5 = ++ * LSB BIT 6 = ++ * LSB BIT 7 = ++ * ++ * MSB BIT 0 = ++ * MSB BIT 1 = ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = ++ * MSB BIT 6 = ++ * MSB BIT 7 = ++ */ ++ uint8_t adapter_features[2]; ++ ++ uint8_t reserved_4[16]; ++ ++ /* Subsystem vendor ID for ISP2200 */ ++ uint16_t subsystem_vendor_id_2200; ++ ++ /* Subsystem device ID for ISP2200 */ ++ uint16_t subsystem_device_id_2200; ++ ++ uint8_t reserved_5; ++ uint8_t checksum; ++} nvram_t; ++ ++ ++/* ++ * ISP queue - command entry structure definition. ++ */ ++#define MAX_CMDSZ 16 /* SCSI maximum CDB size. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++#define COMMAND_TYPE 0x11 /* Command entry */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t handle; /* System handle. */ ++#if defined(EXTENDED_IDS) ++ uint16_t target; /* SCSI ID */ ++#else ++ uint8_t reserved; ++ uint8_t target; /* SCSI ID */ ++#endif ++ uint16_t lun; /* SCSI LUN */ ++ uint16_t control_flags; /* Control flags. */ ++#define CF_HEAD_TAG BIT_1 ++#define CF_ORDERED_TAG BIT_2 ++#define CF_SIMPLE_TAG BIT_3 ++#define CF_READ BIT_5 ++#define CF_WRITE BIT_6 ++ uint16_t reserved_1; ++ uint16_t timeout; /* Command timeout. */ ++ uint16_t dseg_count; /* Data segment count. */ ++ uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ ++ uint32_t byte_count; /* Total byte count. */ ++ uint32_t dseg_0_address; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++ uint32_t dseg_2_address; /* Data segment 2 address. */ ++ uint32_t dseg_2_length; /* Data segment 2 length. */ ++} cmd_entry_t; ++ ++/* ++ * ISP queue - 64-Bit addressing, command entry structure definition. ++ */ ++#define COMMAND_A64_TYPE 0x19 /* Command A64 entry */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t handle; /* System handle. */ ++#if defined(EXTENDED_IDS) ++ uint16_t target; /* SCSI ID */ ++#else ++ uint8_t reserved; ++ uint8_t target; /* SCSI ID */ ++#endif ++ uint16_t lun; /* SCSI LUN */ ++ uint16_t control_flags; /* Control flags. */ ++ uint16_t reserved_1; ++ uint16_t timeout; /* Command timeout. */ ++ uint16_t dseg_count; /* Data segment count. */ ++ uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ ++ uint32_t byte_count; /* Total byte count. */ ++ uint32_t dseg_0_address[2]; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address[2]; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++} cmd_a64_entry_t, request_t; ++ ++/* ++ * ISP queue - continuation entry structure definition. ++ */ ++#define CONTINUE_TYPE 0x02 /* Continuation entry. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t reserved; ++ uint32_t dseg_0_address; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++ uint32_t dseg_2_address; /* Data segment 2 address. */ ++ uint32_t dseg_2_length; /* Data segment 2 length. */ ++ uint32_t dseg_3_address; /* Data segment 3 address. */ ++ uint32_t dseg_3_length; /* Data segment 3 length. */ ++ uint32_t dseg_4_address; /* Data segment 4 address. */ ++ uint32_t dseg_4_length; /* Data segment 4 length. */ ++ uint32_t dseg_5_address; /* Data segment 5 address. */ ++ uint32_t dseg_5_length; /* Data segment 5 length. */ ++ uint32_t dseg_6_address; /* Data segment 6 address. */ ++ uint32_t dseg_6_length; /* Data segment 6 length. */ ++} cont_entry_t; ++ ++/* ++ * ISP queue - 64-Bit addressing, continuation entry structure definition. ++ */ ++#define CONTINUE_A64_TYPE 0x0A /* Continuation A64 entry. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t dseg_0_address[2]; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address[2]; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++ uint32_t dseg_2_address[2]; /* Data segment 2 address. */ ++ uint32_t dseg_2_length; /* Data segment 2 length. */ ++ uint32_t dseg_3_address[2]; /* Data segment 3 address. */ ++ uint32_t dseg_3_length; /* Data segment 3 length. */ ++ uint32_t dseg_4_address[2]; /* Data segment 4 address. */ ++ uint32_t dseg_4_length; /* Data segment 4 length. */ ++} cont_a64_entry_t; ++ ++/* ++ * ISP queue - status entry structure definition. ++ */ ++#define STATUS_TYPE 0x03 /* Status entry. */ ++#define STS_SENSE_BUF_LEN 32 ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++#define RF_INV_E_ORDER BIT_5 /* Invalid entry order. */ ++#define RF_INV_E_COUNT BIT_4 /* Invalid entry count. */ ++#define RF_INV_E_PARAM BIT_3 /* Invalid entry parameter. */ ++#define RF_INV_E_TYPE BIT_2 /* Invalid entry type. */ ++#define RF_BUSY BIT_1 /* Busy */ ++ uint32_t handle; /* System handle. */ ++ uint16_t scsi_status; /* SCSI status. */ ++ uint16_t comp_status; /* Completion status. */ ++ uint16_t state_flags; /* State flags. */ ++ uint16_t status_flags; /* Status flags. */ ++#define IOCBSTAT_SF_LOGO BIT_13 /* Logo after 2 abts w/no */ ++ /* response (2 sec) */ ++ uint16_t rsp_info_len; /* Response Info Length. */ ++ uint16_t req_sense_length; /* Request sense data length. */ ++ uint32_t residual_length; /* Residual transfer length. */ ++ uint8_t rsp_info[8]; /* FCP response information. */ ++ /* Request sense data. */ ++ uint8_t req_sense_data[STS_SENSE_BUF_LEN]; ++} sts_entry_t, response_t; ++ ++/* ++ * ISP queue - marker entry structure definition. ++ */ ++#define MARKER_TYPE 0x04 /* Marker entry. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t sys_define_2; /* System defined. */ ++#if defined(EXTENDED_IDS) ++ uint16_t target; /* SCSI ID */ ++#else ++ uint8_t reserved; ++ uint8_t target; /* SCSI ID */ ++#endif ++ uint8_t modifier; /* Modifier (7-0). */ ++#define MK_SYNC_ID_LUN 0 /* Synchronize ID/LUN */ ++#define MK_SYNC_ID 1 /* Synchronize ID */ ++#define MK_SYNC_ALL 2 /* Synchronize all ID/LUN */ ++#define MK_SYNC_LIP 3 /* Synchronize all ID/LUN, */ ++ /* clear port changed, */ ++ /* use sequence number. */ ++ uint8_t reserved_1; ++ uint16_t sequence_number; /* Sequence number of event */ ++ uint16_t lun; /* SCSI LUN */ ++ uint8_t reserved_2[48]; ++} mrk_entry_t; ++ ++/* ++ * ISP queue - Status Contination entry structure definition. ++ */ ++#define STATUS_CONT_TYPE 0x10 /* Status contination entry */ ++#define EXT_STS_SENSE_BUF_LEN 60 ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t reserved; ++ uint8_t entry_status; /* Entry Status. */ ++ /* Extended sense data. */ ++ uint8_t req_sense_data[EXT_STS_SENSE_BUF_LEN]; ++} sts_cont_entry_t; ++ ++/* ++ * ISP queue - Management Server entry structure definition. ++ */ ++#define MS_IOCB_TYPE 0x29 /* Management Server IOCB entry */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t handle1; /* System handle. */ ++#if defined(EXTENDED_IDS) ++ uint16_t loop_id; ++#else ++ uint8_t reserved; ++ uint8_t loop_id; ++#endif ++ uint16_t status; ++ uint16_t control_flags; /* Control flags. */ ++ uint16_t reserved2; ++ uint16_t timeout; ++ uint16_t cmd_dsd_count; ++ uint16_t total_dsd_count; ++ uint8_t type; ++ uint8_t r_ctl; ++ uint16_t rx_id; ++ uint16_t reserved3; ++ uint32_t handle2; ++ uint32_t rsp_bytecount; ++ uint32_t req_bytecount; ++ uint32_t dseg_req_address[2]; /* Data segment 0 address. */ ++ uint32_t dseg_req_length; /* Data segment 0 length. */ ++ uint32_t dseg_rsp_address[2]; /* Data segment 1 address. */ ++ uint32_t dseg_rsp_length; /* Data segment 1 length. */ ++} ms_iocb_entry_t; ++ ++ ++/* ++ * ISP queue - Mailbox Command entry structure definition. ++ */ ++#define ET_MAILBOX_COMMAND 0x39 ++struct mbx_entry { ++ uint8_t entry_type; ++ ++ uint8_t entry_count; ++ uint8_t sys_define1; ++ /* Use sys_define1 for source type */ ++#define SOURCE_SCSI 0x00 ++#define SOURCE_IP 0x01 ++#define SOURCE_VI 0x02 ++#define SOURCE_SCTP 0x03 ++#define SOURCE_MP 0x04 ++#define SOURCE_MPIOCTL 0x05 ++ ++ uint8_t entry_status; ++ ++ uint32_t handle; ++#if defined(EXTENDED_IDS) ++ uint16_t loop_id; ++#else ++ uint8_t reserved_1; ++ uint8_t loop_id; ++#endif ++ ++ uint16_t status; ++ uint16_t state_flags; ++ uint16_t status_flags; ++ uint16_t sys_define2[4]; ++ uint16_t mb0; ++ /* Mailbox command completion status */ ++#define MBS_PORT_ID_IN_USE 0x4007 ++#define MBS_LOOP_ID_IN_USE 0x4008 ++#define MBS_ALL_LOOP_IDS_IN_USE 0x4009 ++#define MBS_NAME_SERVER_NOT_LOGGED_IN 0x400A ++ ++ uint16_t mb1; ++ /* Fabric login mailbox command option bits */ ++#define MBC_NO_PLOGI_IF_LOGGED_IN 0x01 ++#define MBC_NO_PROCESS_LOGIN 0x02 ++ ++ uint16_t mb2; ++ uint16_t mb3; ++ uint16_t mb6; ++ uint16_t mb7; ++#if defined(EXTENDED_IDS) ++ uint16_t mb9; ++ uint16_t mb10; ++ uint32_t reserved_2[6]; ++#else ++ uint32_t reserved_2[7]; ++#endif ++}; ++ ++/* ++ * ISP request and response queue entry sizes ++ */ ++#define RESPONSE_ENTRY_SIZE (sizeof(response_t)) ++#define REQUEST_ENTRY_SIZE (sizeof(request_t)) ++ ++/* ++ * ISP status entry - completion status definitions. ++ */ ++#define CS_COMPLETE 0x0 /* No errors */ ++#define CS_INCOMPLETE 0x1 /* Incomplete transfer of cmd. */ ++#define CS_DMA 0x2 /* A DMA direction error. */ ++#define CS_TRANSPORT 0x3 /* Transport error. */ ++#define CS_RESET 0x4 /* SCSI bus reset occurred */ ++#define CS_ABORTED 0x5 /* System aborted command. */ ++#define CS_TIMEOUT 0x6 /* Timeout error. */ ++#define CS_DATA_OVERRUN 0x7 /* Data overrun. */ ++#define CS_DATA_UNDERRUN 0x15 /* Data Underrun. */ ++#define CS_ABORT_MSG 0xE /* Target rejected abort msg. */ ++#define CS_DEV_RESET_MSG 0x12 /* Target rejected dev rst msg. */ ++#define CS_PORT_UNAVAILABLE 0x28 /* Port unavailable (selection timeout) */ ++#define CS_PORT_LOGGED_OUT 0x29 /* Port Logged Out */ ++#define CS_PORT_CONFIG_CHG 0x2A /* Port Configuration Changed */ ++#define CS_PORT_BUSY 0x2B /* Port Busy */ ++#define CS_BAD_PAYLOAD 0x80 /* Driver defined */ ++#define CS_UNKNOWN 0x81 /* Driver defined */ ++#define CS_RETRY 0x82 /* Driver defined */ ++#define CS_QUEUE_FULL 0x1c /* Target queue full*/ ++ ++/* ++ * ISP status entry - SCSI status byte bit definitions. ++ */ ++#define SS_MASK 0xfff /* Mask off reserved bits BIT_12-BIT_15*/ ++#define SS_RESIDUAL_UNDER BIT_11 ++#define SS_RESIDUAL_OVER BIT_10 ++#define SS_SENSE_LEN_VALID BIT_9 ++#if defined(ISP2100) ++#define SS_RESIDUAL_LEN_VALID BIT_8 ++#else ++#define SS_RESPONSE_INFO_LEN_VALID BIT_8 ++#endif ++ ++#define SS_RESERVE_CONFLICT (BIT_4 | BIT_3) ++#define SS_BUSY_CONDITION BIT_3 ++#define SS_CONDITION_MET BIT_2 ++#define SS_CHECK_CONDITION BIT_1 ++ ++/* ++ * 24 bit port ID type definition. ++ */ ++typedef union { ++ uint32_t b24 : 24; ++ ++ struct { ++ uint8_t d_id[3]; ++ uint8_t rsvd_1; ++ } r; ++ ++ struct { ++ uint8_t al_pa; ++ uint8_t area; ++ uint8_t domain; ++ uint8_t rsvd_1; ++ } b; ++} port_id_t; ++ ++/* ++ * Switch info gathering structure. ++ */ ++typedef struct { ++ port_id_t d_id; ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ uint32_t type; ++#define SW_TYPE_SCSI BIT_0 ++#define SW_TYPE_IP BIT_1 ++} sw_info_t; ++ ++//TODO This should be removed (simplified fcport list) ++typedef struct ++{ ++ port_id_t d_id; ++ uint8_t name[WWN_SIZE]; ++ uint8_t wwn[WWN_SIZE]; /* port name */ ++ uint16_t loop_id; ++ uint16_t flag; ++ /* flags bits defined as follows */ ++#define DEV_PUBLIC BIT_0 ++#define DEV_LUNMASK_SET BIT_1 /* some LUNs masked for this device */ ++#define DEV_TAPE_DEVICE BIT_2 ++#define DEV_RELOGIN BIT_3 ++#define DEV_PORT_DOWN BIT_4 ++#define DEV_CONFIGURED BIT_5 ++#define DEV_ABSENCE BIT_6 ++#define DEV_RETURN BIT_7 ++#define DEV_INITIATOR BIT_8 ++#define DEV_FLAG_VSA BIT_9 ++ int port_login_retry_count; ++ uint8_t port_timer; ++}fcdev_t; ++ ++/* New device name list struct; used in configure_fabric. */ ++struct new_dev { ++ port_id_t d_id; ++ uint8_t name[WWN_SIZE]; ++ uint8_t wwn[WWN_SIZE]; /* port name */ ++}; ++#define LOGOUT_PERFORMED 0x01 ++ ++ ++/* ++ * Inquiry command structure. ++ */ ++#define INQ_SCSI_OPCODE 0x12 ++#define INQ_DATA_SIZE 36 ++ ++/* ++ * Inquiry mailbox IOCB packet definition. ++ */ ++typedef struct { ++ union { ++ cmd_a64_entry_t cmd; ++ sts_entry_t rsp; ++ } p; ++ uint8_t inq[INQ_DATA_SIZE]; ++} inq_cmd_rsp_t; ++ ++/* ++ * Report LUN command structure. ++ */ ++#define RPT_LUN_SCSI_OPCODE 0xA0 ++#define CHAR_TO_SHORT(a, b) (uint16_t)((uint8_t)b << 8 | (uint8_t)a) ++ ++typedef struct { ++ uint32_t len; ++ uint32_t rsrv; ++} rpt_hdr_t; ++ ++typedef struct { ++ struct { ++ uint8_t b : 6; ++ uint8_t address_method : 2; ++ } msb; ++ uint8_t lsb; ++ uint8_t unused[6]; ++} rpt_lun_t; ++ ++typedef struct { ++ rpt_hdr_t hdr; ++ rpt_lun_t lst[MAX_LUNS]; ++} rpt_lun_lst_t; ++ ++/* ++ * Report Lun mailbox IOCB packet definition. ++ */ ++typedef struct { ++ union { ++ cmd_a64_entry_t cmd; ++ sts_entry_t rsp; ++ } p; ++ rpt_lun_lst_t list; ++} rpt_lun_cmd_rsp_t; ++ ++//TODO Continue formatting ++/* ++ * SCSI Target Queue structure ++ */ ++typedef struct os_tgt { ++ struct os_lun *olun[MAX_LUNS]; /* LUN context pointer. */ ++ uint8_t port_down_retry_count; ++ struct scsi_qla_host *ha; ++ uint32_t down_timer; ++ ++ /* Persistent binding information */ ++ port_id_t d_id; ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ struct fc_port *vis_port; ++ ++ uint8_t flags; ++#define TGT_BUSY BIT_0 /* Reached hi-water mark */ ++#define TGT_TAGGED_QUEUE BIT_1 /* Tagged queuing. */ ++} os_tgt_t; ++ ++/* ++ * SCSI LUN Queue structure ++ */ ++typedef struct os_lun { ++ struct fc_lun *fclun; /* FC LUN context pointer. */ ++ spinlock_t q_lock; /* Lun Lock */ ++ ++ u_long io_cnt; /* total xfer count since boot */ ++ u_long out_cnt; /* total outstanding IO count */ ++ u_long w_cnt; /* total writes */ ++ u_long r_cnt; /* total reads */ ++ u_long avg_time; /* */ ++ ++ unsigned long q_flag; ++#define LUN_MPIO_BUSY 2 /* Lun is changing paths */ ++#define LUN_SCSI_SCAN_DONE BIT_3 /* indicates the scsi scan is done */ ++#define LUN_EXEC_DELAYED 7 /* Lun execution is delayed */ ++ ++ u_long q_timeout; /* total command timeouts */ ++ atomic_t q_timer; /* suspend timer */ ++ uint32_t q_count; /* current count */ ++ uint32_t q_max; /* maxmum count lun can be suspended */ ++ uint8_t q_state; /* lun State */ ++#define LUN_STATE_READY 1 /* indicates the lun is ready for i/o */ ++#define LUN_STATE_RUN 2 /* indicates the lun has a timer running */ ++#define LUN_STATE_WAIT 3 /* indicates the lun is suspended */ ++#define LUN_STATE_TIMEOUT 4 /* indicates the lun has timed out */ ++ ++} os_lun_t; ++ ++ ++/* LUN BitMask structure definition, array of 32bit words, ++ * 1 bit per lun. When bit == 1, the lun is masked. ++ * Most significant bit of mask[0] is lun 0, bit 24 is lun 7. ++ */ ++typedef struct lun_bit_mask { ++ /* Must allocate at least enough bits to accomodate all LUNs */ ++#if ((MAX_FIBRE_LUNS & 0x7) == 0) ++ UINT8 mask[MAX_FIBRE_LUNS >> 3]; ++#else ++ uint8_t mask[(MAX_FIBRE_LUNS + 8) >> 3]; ++#endif ++} lun_bit_mask_t; ++ ++/* ++ * Fibre channel port structure. ++ */ ++typedef struct fc_port { ++ struct list_head list; ++ ++ struct list_head fcluns; ++ ++ struct scsi_qla_host *ha; ++ struct scsi_qla_host *vis_ha; /* only used when suspending lun */ ++ port_id_t d_id; ++ uint16_t loop_id; ++ uint16_t old_loop_id; ++ int16_t lun_cnt; ++ int16_t dev_id; /* index in fc_dev table */ ++#define FC_NO_LOOP_ID 0x100 ++ uint8_t node_name[WWN_SIZE]; /* Big Endian. */ ++ uint8_t port_name[WWN_SIZE]; /* Big Endian. */ ++ uint8_t mp_byte; /* multi-path byte (not used) */ ++ uint8_t cur_path; /* current path id */ ++ int port_login_retry_count; ++ int login_retry; ++ atomic_t state; /* port state */ ++#define FC_DEVICE_DEAD 1 ++#define FC_DEVICE_LOST 2 ++#define FC_ONLINE 3 ++#define FC_LOGIN_NEEDED 4 ++ ++ uint8_t flags; ++#define FC_FABRIC_DEVICE BIT_0 ++#define FC_TAPE_DEVICE BIT_1 ++#define FC_INITIATOR_DEVICE BIT_2 ++#define FC_CONFIG BIT_3 ++#define FC_VSA BIT_4 ++#define FC_HD_DEVICE BIT_5 ++#define FC_SUPPORT_RPT_LUNS BIT_6 ++ atomic_t port_down_timer; ++ lun_bit_mask_t lun_mask; ++} fc_port_t; ++ ++/* ++ * Fibre channel LUN structure. ++ */ ++typedef struct fc_lun { ++ struct list_head list; ++ ++ fc_port_t *fcport; ++ uint16_t lun; ++ uint8_t max_path_retries; ++ uint8_t flags; ++#define FC_DISCON_LUN BIT_0 ++} fc_lun_t; ++ ++typedef struct ++{ ++ uint8_t in_use; ++}fabricid_t; ++ ++typedef struct { ++ struct list_head list; ++ ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ port_id_t d_id; ++ uint16_t loop_id; ++} fc_initiator_t; ++ ++/* ++ * Registered State Change Notification structures. ++ */ ++typedef struct { ++ port_id_t d_id; ++ uint8_t format; ++} rscn_t; ++ ++/* ++ * Flash Database structures. ++ */ ++#define FLASH_DATABASE_0 0x1c000 ++#define FLASH_DATABASE_1 0x18000 ++#define FLASH_DATABASE_VERSION 1 ++ ++typedef struct ++{ ++ uint32_t seq; ++ uint8_t version; ++ uint8_t checksum; ++ uint16_t size; ++ uint8_t spares[8]; ++}flash_hdr_t; ++ ++typedef struct ++{ ++ uint8_t name[WWN_SIZE]; ++ uint8_t spares[8]; ++}flash_node_t; ++ ++typedef struct ++{ ++ flash_hdr_t hdr; ++ flash_node_t node[MAX_FIBRE_DEVICES]; ++}flash_database_t; ++//TODO End formatting ++ ++/* ++ * FC-CT interface ++ * ++ * NOTE: All structures are in big-endian in form. ++ */ ++ ++#define CT_REJECT_RESPONSE 0x8001 ++#define CT_ACCEPT_RESPONSE 0x8002 ++ ++#define NS_N_PORT_TYPE 0x01 ++#define NS_NL_PORT_TYPE 0x02 ++#define NS_NX_PORT_TYPE 0x7F ++ ++#define GA_NXT_CMD 0x100 ++#define GA_NXT_REQ_SIZE (16 + 4) ++#define GA_NXT_RSP_SIZE (16 + 620) ++ ++#define GID_PT_CMD 0x1A1 ++#define GID_PT_REQ_SIZE (16 + 4) ++#define GID_PT_RSP_SIZE (16 + (MAX_FIBRE_DEVICES * 4)) ++ ++#define GPN_ID_CMD 0x112 ++#define GPN_ID_REQ_SIZE (16 + 4) ++#define GPN_ID_RSP_SIZE (16 + 8) ++ ++#define GNN_ID_CMD 0x113 ++#define GNN_ID_REQ_SIZE (16 + 4) ++#define GNN_ID_RSP_SIZE (16 + 8) ++ ++#define GFT_ID_CMD 0x117 ++#define GFT_ID_REQ_SIZE (16 + 4) ++#define GFT_ID_RSP_SIZE (16 + 32) ++ ++#define RFT_ID_CMD 0x217 ++#define RFT_ID_REQ_SIZE (16 + 4 + 32) ++#define RFT_ID_RSP_SIZE 16 ++ ++#define RFF_ID_CMD 0x21F ++#define RFF_ID_REQ_SIZE (16 + 4 + 2 + 1 + 1) ++#define RFF_ID_RSP_SIZE 16 ++ ++#define RNN_ID_CMD 0x213 ++#define RNN_ID_REQ_SIZE (16 + 4 + 8) ++#define RNN_ID_RSP_SIZE 16 ++ ++#define RSNN_NN_CMD 0x239 ++#define RSNN_NN_REQ_SIZE (16 + 8 + 1 + 255) ++#define RSNN_NN_RSP_SIZE 16 ++ ++/* CT command header -- request/response common fields */ ++struct ct_cmd_hdr { ++ uint8_t revision; ++ uint8_t in_id[3]; ++ uint8_t gs_type; ++ uint8_t gs_subtype; ++ uint8_t options; ++ uint8_t reserved; ++}; ++ ++/* CT command request */ ++struct ct_sns_req { ++ struct ct_cmd_hdr header; ++ uint16_t command; ++ uint16_t max_rsp_size; ++ uint32_t reserved; ++ ++ union { ++ /* GA_NXT, GPN_ID, GNN_ID, GFT_ID */ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ } port_id; ++ ++ struct { ++ uint8_t port_type; ++ uint8_t domain; ++ uint8_t area; ++ uint8_t reserved; ++ } gid_pt; ++ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ uint8_t fc4_types[32]; ++ } rft_id; ++ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ uint16_t reserved2; ++ uint8_t fc4_feature; ++ uint8_t fc4_type; ++ } rff_id; ++ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ uint8_t node_name[8]; ++ } rnn_id; ++ ++ struct { ++ uint8_t node_name[8]; ++ uint8_t name_len; ++ uint8_t sym_node_name[255]; ++ } rsnn_nn; ++ } req; ++}; ++ ++/* CT command response header */ ++struct ct_rsp_hdr { ++ struct ct_cmd_hdr header; ++ uint16_t response; ++ uint16_t residual; ++ uint8_t reserved; ++ uint8_t reason_code; ++ uint8_t explanation_code; ++ uint8_t vendor_unique; ++}; ++ ++struct ct_sns_gid_pt_data { ++ uint8_t control_byte; ++ uint8_t port_id[3]; ++}; ++ ++struct ct_sns_rsp { ++ struct ct_rsp_hdr header; ++ ++ union { ++ struct { ++ uint8_t port_type; ++ uint8_t port_id[3]; ++ uint8_t port_name[8]; ++ uint8_t sym_port_name_len; ++ uint8_t sym_port_name[255]; ++ uint8_t node_name[8]; ++ uint8_t sym_node_name_len; ++ uint8_t sym_node_name[255]; ++ uint8_t init_proc_assoc[8]; ++ uint8_t node_ip_addr[16]; ++ uint8_t class_of_service[4]; ++ uint8_t fc4_types[32]; ++ uint8_t ip_address[16]; ++ uint8_t fabric_port_name[8]; ++ uint8_t reserved; ++ uint8_t hard_address[3]; ++ } ga_nxt; ++ ++ struct { ++ struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES]; ++ } gid_pt; ++ ++ struct { ++ uint8_t port_name[8]; ++ } gpn_id; ++ ++ struct { ++ uint8_t node_name[8]; ++ } gnn_id; ++ ++ struct { ++ uint8_t fc4_types[32]; ++ } gft_id; ++ } rsp; ++}; ++ ++struct ct_sns_pkt { ++ union { ++ struct ct_sns_req req; ++ struct ct_sns_rsp rsp; ++ } p; ++}; ++ ++#if defined(ISP2100) ++#define GN_LIST_LENGTH 126 * sizeof(port_list_entry_t) ++#else ++#define GN_LIST_LENGTH 256 * sizeof(port_list_entry_t) ++#endif ++ ++/* ++ * Structure used in Get Port List mailbox command (0x75). ++ */ ++typedef struct { ++ uint8_t name[WWN_SIZE]; ++ uint16_t loop_id; ++} port_list_entry_t; ++ ++/* ++ * Structure used for device info. ++ */ ++typedef struct { ++ uint8_t name[WWN_SIZE]; ++ uint8_t wwn[WWN_SIZE]; ++ uint16_t loop_id; ++ uint8_t port_id[3]; ++} device_data_t; ++ ++//TODO Complete Formatting... ++ ++/* Mailbox command completion status */ ++#define MBS_PORT_ID_IN_USE 0x4007 ++#define MBS_LOOP_ID_IN_USE 0x4008 ++#define MBS_ALL_LOOP_IDS_IN_USE 0x4009 ++#define MBS_NAME_SERVER_NOT_LOGGED_IN 0x400A ++ ++ ++#define MAX_IOCTL_WAIT_THREADS 32 ++typedef struct _wait_q_t { ++ uint8_t flags; ++#define WQ_IN_USE 0x1 ++ ++ struct semaphore wait_q_sem; ++ struct _wait_q_t *pnext; ++} wait_q_t; ++ ++typedef struct hba_ioctl{ ++ ++ /* Ioctl cmd serialization */ ++ uint16_t access_bits; /* bits should be used atomically */ ++#define IOCTL_ACTIVE 1 /* first bit */ ++#define IOCTL_WANT 2 /* 2nd bit */ ++ ++ spinlock_t wait_q_lock; /* IOCTL wait_q Queue Lock */ ++ wait_q_t wait_q_arr[MAX_IOCTL_WAIT_THREADS]; ++ wait_q_t *wait_q_head; ++ wait_q_t *wait_q_tail; ++ ++ /* Passthru cmd/completion */ ++ struct semaphore cmpl_sem; ++ struct timer_list cmpl_timer; ++ uint8_t ioctl_tov; ++ uint8_t SCSIPT_InProgress; ++ uint8_t MSIOCB_InProgress; ++ ++ os_tgt_t *ioctl_tq; ++ os_lun_t *ioctl_lq; ++ ++ /* AEN queue */ ++ void *aen_tracking_queue;/* points to async events buffer */ ++ uint8_t aen_q_head; /* index to the current head of q */ ++ uint8_t aen_q_tail; /* index to the current tail of q */ ++ ++ /* Misc. */ ++ uint32_t flags; ++#define IOCTL_OPEN BIT_0 ++#define IOCTL_AEN_TRACKING_ENABLE BIT_1 ++ uint8_t *scrap_mem; /* per ha scrap buf for ioctl usage */ ++ uint32_t scrap_mem_size; /* total size */ ++ uint32_t scrap_mem_used; /* portion used */ ++ ++} hba_ioctl_context; ++ ++/* Mailbox command semaphore queue for command serialization */ ++typedef struct _mbx_cmdq_t { ++ struct semaphore cmd_sem; ++ struct _mbx_cmdq_t *pnext; ++} mbx_cmdq_t; ++ ++/* ++ * Linux Host Adapter structure ++ */ ++typedef struct scsi_qla_host ++{ ++ struct list_head list; ++ ++ /* Linux adapter configuration data */ ++ struct Scsi_Host *host; /* pointer to host data */ ++ struct pci_dev *pdev; ++ ++ u_long host_no; ++ u_long instance; ++ ++ device_reg_t *iobase; /* Base Memory-mapped I/O address */ ++ volatile unsigned char *mmpbase; /* memory mapped address */ ++ ++ struct qla_board_info *brd_info; ++ uint16_t fw_major_version; ++ uint16_t fw_minor_version; ++ uint16_t fw_subminor_version; ++ uint16_t fw_attributes; ++ uint32_t fw_transfer_size; ++ ++ uint16_t fw_options1; ++ uint16_t fw_options2; ++ uint16_t fw_options3; ++ uint8_t fw_seriallink_options[2]; ++ ++ ms_iocb_entry_t *ms_iocb; ++ dma_addr_t ms_iocb_dma; ++ struct ct_sns_pkt *ct_sns; ++ dma_addr_t ct_sns_dma; ++ ++ uint16_t isp_ctrl_status; ++ ++ uint16_t revision; ++ uint8_t ports; ++ u_long actthreads; ++ u_long ipreq_cnt; ++ u_long qthreads; ++ u_long spurious_int; ++ uint32_t total_isr_cnt; /* Interrupt count */ ++ uint32_t total_isp_aborts; /* controller err cnt */ ++ uint32_t total_lip_cnt; /* LIP cnt */ ++ uint32_t total_dev_errs; /* device error cnt */ ++ uint32_t total_ios; /* IO cnt */ ++ uint64_t total_bytes; /* xfr byte cnt */ ++ ++ /* Adapter I/O statistics for failover */ ++ uint64_t IosRequested; ++ uint64_t BytesRequested; ++ uint64_t IosExecuted; ++ uint64_t BytesExecuted; ++ ++ /* ISP connection configuration data */ ++ uint16_t max_public_loop_ids; ++ uint16_t min_external_loopid; /* First external loop Id */ ++ uint8_t current_topology; /* Current ISP configuration */ ++ uint8_t prev_topology; /* Previous ISP configuration */ ++ #define ISP_CFG_NL 1 ++ #define ISP_CFG_N 2 ++ #define ISP_CFG_FL 4 ++ #define ISP_CFG_F 8 ++ uint8_t id; /* Host adapter SCSI id */ ++ uint16_t loop_id; /* Host adapter loop id */ ++ port_id_t d_id; /* Host adapter port id */ ++ ++ uint8_t operating_mode; /* current F/W operating mode */ ++ #define LOOP 0 ++ #define P2P 1 ++ #define LOOP_P2P 2 ++ #define P2P_LOOP 3 ++ ++ uint8_t active_fc4_types;/* active fc4 types */ ++ uint8_t current_speed; /* current F/W operating speed */ ++ ++ /* NVRAM configuration data */ ++ uint16_t loop_reset_delay; /* Loop reset delay. */ ++ uint16_t hiwat; /* High water mark per device. */ ++ uint16_t execution_throttle; /* queue depth */ ++ uint16_t minimum_timeout; /* Minimum timeout. */ ++ uint8_t retry_count; ++ uint8_t login_timeout; ++ int port_down_retry_count; ++ uint8_t loop_down_timeout; ++ uint16_t max_probe_luns; ++ uint16_t max_luns; ++ uint16_t max_targets; ++ ++ /* Fibre Channel Device List. */ ++ struct list_head fcports; ++ ++ /* OS target queue pointers. */ ++ os_tgt_t *otgt[MAX_FIBRE_DEVICES]; ++ ++ /* Fibre Channel Device Database and LIP sequence. */ ++ fcdev_t fc_db[MAX_FIBRE_DEVICES]; /* Driver database. */ ++ uint32_t flash_db; /* Flash database address in use. */ ++ fabricid_t fabricid[MAX_FIBRE_DEVICES]; /* Fabric ids table . */ ++ uint32_t flash_seq; /* Flash database seq # in use. */ ++ volatile uint16_t lip_seq; /* LIP sequence number. */ ++ ++ /* Tracks host adapters we find */ ++ struct list_head fcinitiators; /* Initiator database */ ++ ++ /* RSCN queue. */ ++ rscn_t rscn_queue[MAX_RSCN_COUNT]; ++ uint8_t rscn_in_ptr; ++ uint8_t rscn_out_ptr; ++ ++ /* Doneq bottom half handler */ ++ struct work_struct run_qla_task; ++ ++ /* __get_free_pages() srb_t pool */ ++ srb_t *srb_pool; ++ int srb_pool_order; ++ ++ /* ++ * Need to hold the list_lock with irq's disabled in order to ++ * access the following list. ++ * This list_lock is of lower priority than the io_request_lock. ++ */ ++ /*********************************************************/ ++ spinlock_t list_lock; /* lock to guard lists which ++ hold srb_t's*/ ++ struct list_head retry_queue; /* watchdog queue */ ++ struct list_head done_queue; /* job on done queue */ ++ struct list_head failover_queue; /* failover list link. */ ++ struct list_head free_queue; /* SRB free queue */ ++ struct list_head scsi_retry_queue; /* SCSI retry queue */ ++ ++ struct list_head pending_queue; /* SCSI command pending queue */ ++ ++ /*********************************************************/ ++ ++ /* This spinlock is used to protect "io transactions", you must ++ * aquire it before doing any IO to the card, eg with RD_REG*() and ++ * WRT_REG*() for the duration of your entire commandtransaction. ++ * ++ * This spinlock is of lower priority than the io request lock. ++ */ ++ ++ spinlock_t hardware_lock; ++ ++ /* Linux kernel thread */ ++#if 0 ++ struct task_struct *dpc_handler; /* kernel thread */ ++ struct semaphore *dpc_notify; /* requester waits for DPC on this semaphore */ ++ struct semaphore dpc_sem; /* DPC's semaphore */ ++#endif ++ pid_t dpc_pid; ++ int dpc_should_die; ++ struct completion dpc_inited; ++ struct completion dpc_exited; ++ struct semaphore *dpc_wait; ++ ++ uint8_t dpc_active; /* DPC routine is active */ ++ ++ /* Received ISP mailbox data. */ ++ volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; ++ ++ /* Outstandings ISP commands. */ ++ srb_t *outstanding_cmds[MAX_OUTSTANDING_COMMANDS]; ++ uint32_t current_outstanding_cmd; ++ ++ /* ISP ring lock, rings, and indexes */ ++ dma_addr_t request_dma; /* Physical address. */ ++ request_t *request_ring; /* Base virtual address */ ++ request_t *request_ring_ptr; /* Current address. */ ++ uint16_t req_ring_index; /* Current index. */ ++ uint16_t req_q_cnt; /* Number of available entries. */ ++ ++ dma_addr_t response_dma; /* Physical address. */ ++ response_t *response_ring; /* Base virtual address */ ++ response_t *response_ring_ptr; /* Current address. */ ++ uint16_t rsp_ring_index; /* Current index. */ ++ ++#if defined(FC_IP_SUPPORT) ++ /* Data for IP support */ ++ uint8_t ip_port_name[WWN_SIZE]; ++ ++ struct risc_rec_entry *risc_rec_q; /* RISC receive queue */ ++ dma_addr_t risc_rec_q_dma; /* physical address */ ++ uint16_t rec_entries_in; ++ uint16_t rec_entries_out; ++ ++ struct send_cb *active_scb_q[MAX_SEND_PACKETS]; ++ uint32_t current_scb_q_idx; ++ ++ uint32_t mtu; ++ uint16_t header_size; ++ uint16_t max_receive_buffers; ++ struct buffer_cb *receive_buffers; ++ uint32_t receive_buff_data_size; ++ ++ void (*send_completion_routine) ++ (struct send_cb *scb); ++ void *receive_packets_context; ++ void (*receive_packets_routine) ++ (void *context, struct buffer_cb *bcb); ++ void *notify_context; ++ void (*notify_routine) ++ (void *context, uint32_t type); ++ ++ struct ip_device ipdev_db[QLLAN_MAX_IP_DEVICES]; ++ struct ip_device *ipdev_db_next_free; ++ struct ip_device *ipdev_db_top; ++ struct ip_device *ipdev_db_bottom; ++#endif ++ ++ /* Firmware Initialization Control Block data */ ++ dma_addr_t init_cb_dma; /* Physical address. */ ++ init_cb_t *init_cb; ++ ++ /* Timeout timers. */ ++ uint8_t queue_restart_timer; ++ atomic_t loop_down_timer; /* loop down timer */ ++ uint8_t loop_down_abort_time; /* port down timer */ ++ uint32_t timer_active; ++ uint32_t forceLip; ++ struct timer_list timer; ++ ++ /* These are used by mailbox operations. */ ++ mbx_cmd_t *mcp; ++ unsigned long mbx_cmd_flags; ++#define MBX_CMD_ACTIVE 1 /* first bit */ ++#define MBX_CMD_WANT 2 /* 2nd bit */ ++#define MBX_INTERRUPT 3 /* 3rd bit */ ++#define MBX_INTR_WAIT 4 /* 4rd bit */ ++ ++ spinlock_t mbx_reg_lock; /* Mbx Cmd Register Lock */ ++ spinlock_t mbx_q_lock; /* Mbx Active Cmd Queue Lock */ ++ spinlock_t mbx_bits_lock; /* Mailbox access bits Lock */ ++ ++ uint32_t mbx_lock_bits; /* controlled by mbx_bits_lock */ ++#define MBX_CMD_LOCK 1 /* first bit */ ++#define MBX_CMD_WANT 2 /* 2nd bit */ ++ ++ struct semaphore mbx_intr_sem; /* Used for completion notification */ ++ ++ mbx_cmdq_t *mbx_sem_pool_head; /* Head Pointer to a list of ++ * recyclable mbx semaphore pool ++ * to be used during run time. ++ */ ++ mbx_cmdq_t *mbx_sem_pool_tail; /* Tail Pointer to semaphore pool*/ ++#define MBQ_INIT_LEN 16 /* initial mbx sem pool q len. actual len may vary */ ++ ++ mbx_cmdq_t *mbx_q_head; /* Head Pointer to sem q for active cmds */ ++ mbx_cmdq_t *mbx_q_tail; /* Tail Pointer to sem q for active cmds */ ++ ++ ++ uint32_t retry_q_cnt; ++ uint32_t scsi_retry_q_cnt; ++ uint32_t failover_cnt; ++ ++ uint8_t *cmdline; ++ ++ uint32_t login_retry_count; ++ ++ volatile struct ++ { ++ uint32_t online :1; /* 0 */ ++ uint32_t enable_64bit_addressing :1; /* 1 */ ++ uint32_t mbox_int :1; /* 2 */ ++ uint32_t mbox_busy :1; /* 3 */ ++ // UNUSED and UNASSIGNED ++ uint32_t port_name_used :1; /* 4 */ ++ uint32_t failover_enabled :1; /* 5 */ ++ uint32_t watchdog_enabled :1; /* 6 */ ++ uint32_t cfg_suspended :1; /* 7 */ ++ ++ uint32_t disable_host_adapter :1; /* 8 */ ++ uint32_t rscn_queue_overflow :1; /* 9 */ ++ uint32_t reset_active :1; /* 10 */ ++ uint32_t link_down_error_enable :1; /* 11 */ ++ ++ uint32_t disable_risc_code_load :1; /* 12 */ ++ uint32_t set_cache_line_size_1 :1; /* 13 */ ++ uint32_t enable_target_mode :1; /* 14 */ ++ uint32_t disable_luns :1; /* 15 */ ++ ++ uint32_t enable_lip_reset :1; /* 16 */ ++ uint32_t enable_lip_full_login :1; /* 17 */ ++ uint32_t enable_target_reset :1; /* 18 */ ++ uint32_t updated_fc_db :1; /* 19 */ ++ ++ uint32_t enable_flash_db_update :1; /* 20 */ ++ uint32_t in_isr :1; /* 21 */ ++ uint32_t dpc_sched :1; /* 23 */ ++ ++ uint32_t nvram_config_done :1; /* 24 */ ++ uint32_t update_config_needed :1; /* 25 */ ++ uint32_t management_server_logged_in :1; /* 26 */ ++#if defined(FC_IP_SUPPORT) ++ uint32_t enable_ip :1; /* 27 */ ++#endif ++ ++ } flags; ++ ++ uint32_t device_flags; ++#define DFLG_LOCAL_DEVICES BIT_0 ++#define DFLG_RETRY_LOCAL_DEVICES BIT_1 ++#define DFLG_FABRIC_DEVICES BIT_2 ++#define SWITCH_FOUND BIT_3 ++#define DFLG_NO_CABLE BIT_4 ++ ++ unsigned long cpu_flags; ++ ++ uint8_t marker_needed; ++ uint8_t missing_targets; ++ uint8_t sns_retry_cnt; ++ uint8_t cmd_wait_cnt; ++ uint8_t mem_err; ++ ++ unsigned long dpc_flags; ++#define RESET_MARKER_NEEDED 0 /* initiate sending a marker to ISP */ ++#define RESET_ACTIVE 1 ++#define ISP_ABORT_NEEDED 2 /* initiate ISP Abort */ ++#define ABORT_ISP_ACTIVE 3 /* isp abort in progress */ ++ ++#define LOOP_RESYNC_NEEDED 4 /* initiate a configure fabric sequence */ ++#define LOOP_RESYNC_ACTIVE 5 ++#define COMMAND_WAIT_NEEDED 6 ++#define COMMAND_WAIT_ACTIVE 7 ++ ++#define LOCAL_LOOP_UPDATE 8 /* Perform a local loop update */ ++#define RSCN_UPDATE 9 /* Perform a RSCN update */ ++#define MAILBOX_RETRY 10 ++#define ISP_RESET_NEEDED 11 /* Initiate a ISP reset ??? */ ++ ++#define FAILOVER_EVENT_NEEDED 12 ++#define FAILOVER_EVENT 13 ++#define FAILOVER_NEEDED 14 ++#define LOOP_RESET_NEEDED 15 ++ ++#define DEVICE_RESET_NEEDED 16 ++#define DEVICE_ABORT_NEEDED 17 ++#define SCSI_RESTART_NEEDED 18 /* Processes any requests in scsi retry queue */ ++#define PORT_RESTART_NEEDED 19 /* Processes any requests in retry queue */ ++ ++#define RESTART_QUEUES_NEEDED 20 /* Restarts requeusts in the lun queue */ ++#define ABORT_QUEUES_NEEDED 21 ++#define RELOGIN_NEEDED 22 ++#define LOGIN_RETRY_NEEDED 23 /* initiates any fabric logins that are required */ ++#define REGISTER_FC4_NEEDED 24 /* set when need to register again.*/ ++ ++#define TASKLET_SCHED 25 /* Tasklet is scheduled. */ ++#define DONE_RUNNING 26 /* Done task is running. */ ++#define ISP_ABORT_RETRY 27 /* ISP aborted. */ ++ ++ ++/* macro for timer to start dpc for handling mailbox commands */ ++#define MAILBOX_CMD_NEEDED (LOOP_RESET_NEEDED|DEVICE_RESET_NEEDED| \ ++ DEVICE_ABORT_NEEDED|ISP_ABORT_NEEDED) ++ ++ /* These 3 fields are used by the reset done in dpc thread */ ++ uint16_t reset_bus_id; ++ uint16_t reset_tgt_id; ++ uint16_t reset_lun; ++ ++ uint8_t interrupts_on; ++ uint8_t init_done; ++ ++ volatile uint16_t loop_state; ++#define LOOP_TIMEOUT 0x01 ++#define LOOP_DOWN 0x02 ++#define LOOP_UP 0x04 ++#define LOOP_UPDATE 0x08 ++#define LOOP_READY 0x10 ++ ++ mbx_cmd_t mc; ++ uint32_t mbx_flags; ++#define MBX_IN_PROGRESS BIT_0 ++#define MBX_BUSY BIT_1 /* Got the Access */ ++#define MBX_SLEEPING_ON_SEM BIT_2 ++#define MBX_POLLING_FOR_COMP BIT_3 ++#define MBX_COMPLETED BIT_4 ++#define MBX_TIMEDOUT BIT_5 ++#define MBX_ACCESS_TIMEDOUT BIT_6 ++ ++/* following are new and needed for IOCTL support */ ++ hba_ioctl_context *ioctl; ++ uint8_t node_name[WWN_SIZE]; ++ ++ uint8_t optrom_major; ++ uint8_t optrom_minor; ++ ++ uint8_t nvram_version; ++ ++ void *ioctl_mem; ++ dma_addr_t ioctl_mem_phys; ++ uint32_t ioctl_mem_size; ++ uint32_t isp_abort_cnt; ++ ++ /* HBA serial number */ ++ uint8_t serial0; ++ uint8_t serial1; ++ uint8_t serial2; ++ ++ /* oem related items */ ++ uint8_t oem_id; ++ uint8_t oem_specific[31]; ++ ++ uint32_t dump_done; ++ unsigned long done_q_cnt; ++ unsigned long pending_in_q; ++ ++ uint32_t failover_type; ++ uint32_t failback_delay; ++ unsigned long cfg_flags; ++#define CFG_ACTIVE 0 /* CFG during a failover, event update, or ioctl */ ++ /* uint8_t cfg_active; */ ++ int eh_start; ++ ++#if defined(IOCB_THROLLE_USAGE) ++ uint32_t iocb_hiwat; ++ uint32_t iocb_cnt; ++ uint32_t iocb_overflow_cnt; ++#endif ++ ++ int srb_cnt; ++ int srb_alloc_cnt; /*Number of allocated SRBs */ ++ ++ uint32_t mbox_trace; ++ ++ uint32_t binding_type; ++#define BIND_BY_PORT_NAME 0 ++#define BIND_BY_PORT_ID 1 ++#define BIND_BY_NODE_NAME 2 ++ ++ srb_t *status_srb; /* Keep track of Status Continuation Entries */ ++ ++ uint32_t dropped_frame_error_cnt; ++} scsi_qla_host_t; ++ ++#if defined(__BIG_ENDIAN) ++/* Big endian machine correction defines. */ ++#define LITTLE_ENDIAN_16(x) qla2x00_chg_endian((uint8_t *)&(x), 2) ++#define LITTLE_ENDIAN_24(x) qla2x00_chg_endian((uint8_t *)&(x), 3) ++#define LITTLE_ENDIAN_32(x) qla2x00_chg_endian((uint8_t *)&(x), 4) ++#define LITTLE_ENDIAN_64(x) qla2x00_chg_endian((uint8_t *)&(x), 8) ++#define BIG_ENDIAN_16(x) ++#define BIG_ENDIAN_24(x) ++#define BIG_ENDIAN_32(x) ++#define BIG_ENDIAN_64(x) ++ ++#else ++/* Little endian machine correction defines. */ ++#define LITTLE_ENDIAN_16(x) ++#define LITTLE_ENDIAN_24(x) ++#define LITTLE_ENDIAN_32(x) ++#define LITTLE_ENDIAN_64(x) ++#define BIG_ENDIAN_16(x) qla2x00_chg_endian((uint8_t *)&(x), 2) ++#define BIG_ENDIAN_24(x) qla2x00_chg_endian((uint8_t *)&(x), 3) ++#define BIG_ENDIAN_32(x) qla2x00_chg_endian((uint8_t *)&(x), 4) ++#define BIG_ENDIAN_64(x) qla2x00_chg_endian((uint8_t *)&(x), 8) ++ ++#endif ++ ++/* ++ * Macros to help code, maintain, etc. ++ */ ++#define LOOP_TRANSITION(ha) ( test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \ ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) ) ++ ++#define LOOP_NOT_READY(ha) ( (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \ ++ test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || \ ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \ ++ test_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags) || \ ++ test_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags) || \ ++ test_bit(COMMAND_WAIT_ACTIVE, &ha->dpc_flags)) || \ ++ ha->loop_state == LOOP_DOWN) ++ ++#define LOOP_RDY(ha) ( !LOOP_NOT_READY(ha) ) ++ ++#define TGT_Q(ha, t) (ha->otgt[t]) ++#define LUN_Q(ha, t, l) (TGT_Q(ha, t)->olun[l]) ++#define GET_LU_Q(ha, t, l) ( (TGT_Q(ha,t) != NULL)? TGT_Q(ha, t)->olun[l] : NULL) ++#define PORT_DOWN_TIMER(ha, t) ((ha)->fc_db[(t)].port_timer) ++#define PORT(ha, t) ((ha)->fc_db[(t)]) ++#define PORT_LOGIN_RETRY(fcport) ((fcport)->port_login_retry_count) ++ ++#define MBOX_TRACE(ha,b) {(ha)->mbox_trace |= (b);} ++ ++#define MBS_MASK 0x3fff ++#define MBS_END 0x100 ++#define QLA2X00_SUCCESS (MBS_COMMAND_COMPLETE & MBS_MASK) ++#define QLA2X00_FAILED (MBS_END + 2) ++#define QLA2X00_FUNCTION_FAILED (MBS_END + 2) ++ ++#define KMEM_ZALLOC(siz,id) qla2x00_kmem_zalloc((siz), GFP_ATOMIC, (id)) ++#define KMEM_FREE(ip,siz) kfree((ip)) ++ ++/* ++ * LOCK MACROS ++ */ ++#define QLA_MBX_REG_LOCK(ha) \ ++ spin_lock_irqsave(&(ha)->mbx_reg_lock, mbx_flags); ++#define QLA_MBX_REG_UNLOCK(ha) \ ++ spin_unlock_irqrestore(&(ha)->mbx_reg_lock, mbx_flags); ++ ++/* ++* Stat info for all adpaters ++*/ ++struct _qla2x00stats { ++ unsigned long mboxtout; /* mailbox timeouts */ ++ unsigned long mboxerr; /* mailbox errors */ ++ unsigned long ispAbort; /* ISP aborts */ ++ unsigned long debugNo; ++ unsigned long loop_resync; ++ unsigned long outarray_full; ++ unsigned long retry_q_cnt; ++}; ++ ++#define SYS_DELAY(x) udelay(x);barrier() ++#define QLA2100_DELAY(sec) mdelay(sec * HZ) ++#define NVRAM_DELAY() udelay(10) ++#define UDELAY(x) udelay(x) ++ ++#define CACHE_FLUSH(a) (RD_REG_WORD(a)) ++#define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS+1) ++ ++#define ABORTS_ACTIVE ((test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) || \ ++ (test_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags)) || \ ++ (test_bit(DEVICE_ABORT_NEEDED, &ha->dpc_flags)) || \ ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags))) ++ ++/* ++ * Flash support definitions ++ */ ++#define FLASH_IMAGE_SIZE 131072 ++ ++#include "qla_fo.h" ++#include "qla_cfg.h" ++#include "qla_gbl.h" ++#include "qla_dbg.h" ++#include "qla_inline.h" ++#include "qla_listops.h" ++ ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1681 @@ ++/******************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 Qlogic Corporation ++* (www.qlogic.com) ++* ++* 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. ++* ++****************************************************************************** ++* Failover include file ++******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "qlfo.h" ++#include "qlfolimits.h" ++ ++//TODO Why?? ++#include "qla_fo.cfg" ++ ++/* ++ * Global variables ++ */ ++SysFoParams_t qla_fo_params; ++ ++/* ++ * Local routines ++ */ ++#if !defined(linux) ++static int qla2x00_sdm_setup(EXT_IOCTL *cmd_stp, void *arg, int mode); ++#endif ++static uint32_t qla2x00_fo_get_params(PFO_PARAMS pp); ++static uint32_t qla2x00_fo_set_params(PFO_PARAMS pp); ++static uint8_t qla2x00_fo_count_retries(scsi_qla_host_t *ha, srb_t *sp); ++static int qla2x00_fo_get_lun_data(EXT_IOCTL *pext, ++ FO_LUN_DATA_INPUT *bp, int mode); ++static int qla2x00_fo_set_lun_data(EXT_IOCTL *pext, ++ FO_LUN_DATA_INPUT *bp, int mode); ++static uint32_t qla2x00_fo_stats(FO_HBA_STAT *stat_p, uint8_t reset); ++static int qla2x00_fo_set_target_data(EXT_IOCTL *pext, ++ FO_TARGET_DATA_INPUT *bp, int mode); ++static int qla2x00_fo_get_target_data(EXT_IOCTL *pext, ++ FO_TARGET_DATA_INPUT *bp, int mode); ++ ++/* ++ * qla2x00_get_hba ++ * Searches the hba structure chain for the requested instance ++ * aquires the mutex and returns a pointer to the hba structure. ++ * ++ * Input: ++ * inst = adapter instance number. ++ * ++ * Returns: ++ * Return value is a pointer to the adapter structure or ++ * NULL if instance not found. ++ * ++ * Context: ++ * Kernel context. ++ */ ++scsi_qla_host_t * ++qla2x00_get_hba(int instance) ++{ ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ ha = NULL; ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (ha->instance == instance) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ return (found ? ha : NULL); ++} ++ ++/* ++ * qla2x00_fo_stats ++ * Searches the hba structure chan for the requested instance ++ * aquires the mutex and returns a pointer to the hba structure. ++ * ++ * Input: ++ * stat_p = Pointer to FO_HBA_STAT union. ++ * reset = Flag, TRUE = reset statistics. ++ * FALSE = return statistics values. ++ * ++ * Returns: ++ * 0 = success ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_fo_stats(FO_HBA_STAT *stat_p, uint8_t reset) ++{ ++ int32_t inst, idx; ++ uint32_t rval = 0; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ inst = stat_p->input.HbaInstance; ++ stat_p->info.HbaCount = 0; ++ ++ ha = NULL; ++ ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (inst == FO_ADAPTER_ALL) { ++ stat_p->info.HbaCount++; ++ idx = ha->instance; ++ } else if (ha->instance == inst) { ++ stat_p->info.HbaCount = 1; ++ idx = inst; ++ } ++ if (reset == TRUE) { ++ DEBUG9(printk("%s: reset stats.\n", __func__);) ++ ha->IosRequested = 0; ++ ha->BytesRequested = 0; ++ ha->IosExecuted = 0; ++ ha->BytesExecuted = 0; ++ } else { ++ DEBUG9(printk("%s: get stats for inst %d.\n", ++ __func__, inst);) ++ ++#if 0 ++ stat_p->info.StatEntry[idx].IosRequested = ++ ha->IosRequested; ++ stat_p->info.StatEntry[idx].BytesRequested = ++ ha->BytesRequested; ++ stat_p->info.StatEntry[idx].IosExecuted = ++ ha->IosExecuted; ++ stat_p->info.StatEntry[idx].BytesExecuted = ++ ha->BytesExecuted; ++#endif ++ } ++ if (inst != FO_ADAPTER_ALL) ++ break; ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_fo_get_lun_data ++ * Get lun data from all devices attached to a HBA (FO_GET_LUN_DATA). ++ * Gets lun mask if failover not enabled. ++ * ++ * Input: ++ * ha = pointer to adapter ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_get_lun_data(EXT_IOCTL *pext, FO_LUN_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ struct list_head *fcports, *fcpl; ++ fc_port_t *fcport; ++ int ret = 0; ++ mp_host_t *host = NULL; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ os_tgt_t *ostgt; ++ uint8_t path_id; ++ uint16_t dev_no; ++ uint16_t cnt; ++ uint16_t lun; ++ FO_EXTERNAL_LUN_DATA_ENTRY *u_entry, *entry; ++ FO_LUN_DATA_LIST *u_list, *list; ++ ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ DEBUG4(printk("%s: hba %p, buff %p bp->HbaInstance(%x).\n", ++ __func__, ha, bp, (int)bp->HbaInstance)); ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ list = (FO_LUN_DATA_LIST *)qla2x00_kmem_zalloc( ++ sizeof(FO_LUN_DATA_LIST), GFP_ATOMIC, 12); ++ if (list == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_LUN_DATA_LIST));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ entry = &list->DataEntry[0]; ++ ++ u_list = (FO_LUN_DATA_LIST *)pext->ResponseAdr; ++ u_entry = &u_list->DataEntry[0]; ++ ++ /* find the correct fcport list */ ++ if (!ha->flags.failover_enabled) ++ fcports = &ha->fcports; ++ else ++ fcports = host->fcports; ++ ++ /* Check thru this adapter's fcport list */ ++ fcport = NULL; ++ list_for_each(fcpl, fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ memcpy(entry->NodeName, ++ fcport->node_name, EXT_DEF_WWN_NAME_SIZE); ++ memcpy(entry->PortName, ++ fcport->port_name, EXT_DEF_WWN_NAME_SIZE); ++ ++ if (!ha->flags.failover_enabled) { ++ /* ++ * Failover disabled. Just return LUN mask info ++ * in lun data entry of this port. ++ */ ++ entry->TargetId = 0; ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (!(ostgt = ha->otgt[cnt])) { ++ continue; ++ } ++ ++ if (ostgt->vis_port == fcport) { ++ entry->TargetId = cnt; ++ break; ++ } ++ } ++ if (cnt == MAX_FIBRE_DEVICES) { ++ /* Not found? For now just go to next port. */ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_10) ++ uint8_t *tmp_name; ++ ++ tmp_name = fcport->port_name; ++ ++ printk("%s(%ld): ERROR - port " ++ "%02x%02x%02x%02x%02x%02x%02x%02x " ++ "not configured.\n", ++ __func__, ha->host_no, ++ tmp_name[0], tmp_name[1], tmp_name[2], ++ tmp_name[3], tmp_name[4], tmp_name[5], ++ tmp_name[6], tmp_name[7]); ++#endif /* DEBUG */ ++ ++ continue; ++ } ++ ++ /* Got a valid port */ ++ list->EntryCount++; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ /* set MSB if masked */ ++ entry->Data[lun] = LUN_DATA_PREFERRED_PATH; ++ if (!EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), ++ lun)) { ++ entry->Data[lun] |= LUN_DATA_ENABLED; ++ } ++ } ++ ++ DEBUG9(printk("%s: got lun_mask for tgt %d\n", ++ __func__, cnt);) ++ DEBUG9(qla2x00_dump_buffer((char *)&(fcport->lun_mask), ++ sizeof(lun_bit_mask_t));) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_entry %p verify write" ++ " error. list->EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ ++ if (ret) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_entry %p copy " ++ "error. list->EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ copy_to_user(u_entry, entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ ++ /* Go to next port */ ++ u_entry++; ++ continue; ++ } ++ ++ /* ++ * Failover is enabled. Go through the mp_devs list and return ++ * lun data in configured path. ++ */ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path = path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ /* Got an entry */ ++ entry->TargetId = dp->dev_id; ++ entry->Dev_No = path->id; ++ list->EntryCount++; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ entry->Data[lun] = ++ path->lun_data.data[lun]; ++ } ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "verify wrt err. EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "copy out err. EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ u_entry++; ++ ++ DEBUG9(printk("%s: (output) get_lun_data - " ++ "u_entry(%p) - lun entry[%d] :\n", ++ __func__, u_entry,list->EntryCount - 1);) ++ ++ DEBUG9(qla2x00_dump_buffer((void *)entry, 64);) ++ ++ /* ++ * We found the right path for this port. ++ * Continue with next port. ++ */ ++ break; ++ } ++ ++ /* Continue with next port. */ ++ break; ++ } ++ } ++ ++ DEBUG9(printk("%s: get_lun_data - entry count = [%d]\n", ++ __func__, list->EntryCount);) ++ DEBUG4(printk("%s: get_lun_data - entry count = [%d]\n", ++ __func__, list->EntryCount);) ++ ++ if (ret == 0) { ++ ret = verify_area(VERIFY_WRITE, (void *)&u_list->EntryCount, ++ sizeof(list->EntryCount)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_list->EntryCount %p verify " ++ " write error. list->EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ } else { ++ /* copy number of entries */ ++ ret = copy_to_user(&u_list->EntryCount, &list->EntryCount, ++ sizeof(list->EntryCount)); ++ pext->ResponseLen = FO_LUN_DATA_LIST_MAX_SIZE; ++ } ++ } ++ ++ KMEM_FREE(list, sizeof(FO_LUN_DATA_LIST)); ++ ++ DEBUG9(printk("%s: exiting. ret=%d.\n", __func__, ret);) ++ ++ return ret; ++} ++ ++/* ++ * qla2x00_fo_set_lun_data ++ * Set lun data for the specified device on the attached hba ++ * (FO_SET_LUN_DATA). ++ * Sets lun mask if failover not enabled. ++ * ++ * Input: ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_set_lun_data(EXT_IOCTL *pext, FO_LUN_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ fc_port_t *fcport; ++ int i; ++ int ret = 0; ++ mp_host_t *host = NULL; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ os_tgt_t *ostgt; ++ uint8_t path_id; ++ uint16_t dev_no; ++ uint16_t lun; ++ FO_LUN_DATA_LIST *u_list, *list; ++ FO_EXTERNAL_LUN_DATA_ENTRY *u_entry, *entry; ++ ++ typedef struct _tagStruct { ++ FO_LUN_DATA_INPUT foLunDataInput; ++ FO_LUN_DATA_LIST foLunDataList; ++ } ++ com_struc; ++ com_struc *com_iter; ++ ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ list = (FO_LUN_DATA_LIST *)qla2x00_kmem_zalloc( ++ sizeof(FO_LUN_DATA_LIST), GFP_ATOMIC, 13); ++ if (list == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_LUN_DATA_LIST));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ entry = &list->DataEntry[0]; ++ ++ /* get lun data list from user */ ++ com_iter = (com_struc *)pext->RequestAdr; ++ u_list = &(com_iter->foLunDataList); ++ u_entry = &u_list->DataEntry[0]; ++ ++ ret = verify_area(VERIFY_READ, (void *)u_list, ++ sizeof(FO_LUN_DATA_LIST)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_list %p verify read error.\n", ++ __func__, u_list);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ KMEM_FREE(list, FO_LUN_DATA_LIST); ++ return (ret); ++ } ++ ++ ret = copy_from_user(list, u_list, sizeof(FO_LUN_DATA_LIST)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_list %p copy error.\n", ++ __func__, u_list);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ KMEM_FREE(list, FO_LUN_DATA_LIST); ++ return (ret); ++ } ++ ++ DEBUG2(printk("qla_fo_set_lun_data: pext->RequestAdr(%p) u_list (%p) " ++ "sizeof(FO_LUN_DATA_INPUT) =(%d) and 64 bytes...\n", ++ pext->RequestAdr, u_list, ++ (int)sizeof(FO_LUN_DATA_INPUT));) ++ DEBUG2(qla2x00_dump_buffer((void *)u_list, 64);) ++ ++ for (i = 0; i < list->EntryCount; i++, u_entry++) { ++ ++ ret = verify_area(VERIFY_READ, (void *)u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p verify " ++ " read error.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ret = copy_from_user(entry, u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p copy error.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ if (!ha->flags.failover_enabled) { ++ /* ++ * Failover disabled. Just find the port and set ++ * LUN mask values in lun_mask field of this port. ++ */ ++ ++ if (entry->TargetId >= MAX_FIBRE_DEVICES) ++ /* ERROR */ ++ continue; ++ ++ if (!(ostgt = ha->otgt[entry->TargetId])) ++ /* ERROR */ ++ continue; ++ ++ if (!(fcport = ostgt->vis_port)) ++ /* ERROR */ ++ continue; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ /* set MSB if masked */ ++ if (entry->Data[lun] | LUN_DATA_ENABLED) { ++ EXT_CLR_LUN_BIT(&(fcport->lun_mask), ++ lun); ++ } else { ++ EXT_SET_LUN_BIT(&(fcport->lun_mask), ++ lun); ++ } ++ } ++ ++ /* Go to next entry */ ++ continue; ++ } ++ ++ /* ++ * Failover is enabled. Go through the mp_devs list and set lun ++ * data in configured path. ++ */ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path = path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ path->lun_data.data[lun] = ++ entry->Data[lun]; ++ DEBUG4(printk("cfg_set_lun_data: lun " ++ "data[%d] = 0x%x \n", lun, ++ path->lun_data.data[lun]);) ++ } ++ ++ break; ++ } ++ break; ++ } ++ } ++ ++ KMEM_FREE(list, FO_LUN_DATA_LIST); ++ ++ DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);) ++ ++ return ret; ++} ++ ++/* ++ * qla2x00_fo_get_target_data ++ * Get the target control byte for all devices attached to a HBA. ++ * ++ * Input: ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_get_target_data(EXT_IOCTL *pext, FO_TARGET_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ struct list_head *fcports, *fcpl; ++ fc_port_t *fcport; ++ int ret = 0; ++ mp_host_t *host = NULL; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ os_tgt_t *ostgt; ++ uint8_t i, cnt; ++ uint8_t path_id; ++ uint16_t dev_no; ++ FO_DEVICE_DATA *entry, *u_entry; ++ uint32_t b; ++ ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ entry = (FO_DEVICE_DATA *)qla2x00_kmem_zalloc( ++ sizeof(FO_DEVICE_DATA), GFP_ATOMIC, 14); ++ if (entry == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_DEVICE_DATA));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ u_entry = (FO_DEVICE_DATA *) pext->ResponseAdr; ++ ++ /* find the correct fcport list */ ++ if (!ha->flags.failover_enabled) ++ fcports = &ha->fcports; ++ else ++ fcports = host->fcports; ++ ++ /* Check thru this adapter's fcport list */ ++ i = 0; ++ fcport = NULL; ++ list_for_each(fcpl, fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (i >= MAX_TARGETS) ++ break; ++ ++ memcpy(entry->WorldWideName, ++ fcport->node_name, EXT_DEF_WWN_NAME_SIZE); ++ memcpy(entry->PortName, ++ fcport->port_name, EXT_DEF_WWN_NAME_SIZE); ++ ++ for (b = 0; b < 3 ; b++) ++ entry->PortId[b] = fcport->d_id.r.d_id[2-b]; ++ ++ if (!ha->flags.failover_enabled) { ++ /* ++ * Failover disabled. Just find the port and return ++ * target info. ++ */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (!(ostgt = ha->otgt[cnt])) { ++ continue; ++ } ++ ++ if (ostgt->vis_port == fcport) { ++ entry->TargetId = cnt; ++ break; ++ } ++ } ++ if (cnt == MAX_FIBRE_DEVICES) { ++ /* Not found? For now just go to next port. */ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_10) ++ uint8_t *tmp_name; ++ ++ tmp_name = fcport->port_name; ++ ++ printk("fo_get_target_data(%ld): ERROR " ++ "port %02x%02x%02x%02x%02x%02x%02x%02x " ++ "not configured.\n", ha->host_no, ++ tmp_name[0], tmp_name[1], tmp_name[2], ++ tmp_name[3], tmp_name[4], tmp_name[5], ++ tmp_name[6], tmp_name[7]); ++#endif /* DEBUG */ ++ ++ continue; ++ } ++ ++ entry->MultipathControl = 0; /* always configured */ ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p verify " ++ " wrt err. tgt id=%d.\n", ++ __func__, u_entry, cnt);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p copy " ++ "out err. tgt id=%d.\n", ++ __func__, u_entry, cnt);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ u_entry++; ++ ++ i++; ++ continue; ++ } ++ ++ /* ++ * Failover is enabled. Go through the mp_devs list and ++ * get target data in configured path. ++ */ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path= path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ entry->TargetId = dp->dev_id; ++ entry->Dev_No = path->id; ++ entry->MultipathControl = path->mp_byte; ++ ++ DEBUG9(printk("cfg_get_target_data: path->id " ++ "= %d, target data = 0x%x \n", ++ path->id, path->mp_byte);) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "verify wrt err. tgt id=%d.\n", ++ __func__, u_entry, dp->dev_id);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "copy out err. tgt id=%d.\n", ++ __func__, u_entry, dp->dev_id);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ u_entry++; ++ ++ /* Path found. Continue with next fcport */ ++ break; ++ } ++ break; ++ } ++ i++; ++ } ++ ++ if (ret == 0) { ++ pext->ResponseLen = sizeof(FO_DEVICE_DATABASE); ++ } ++ ++ KMEM_FREE(entry, sizeof(FO_DEVICE_DATA)); ++ ++ DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_fo_set_target_data ++ * Set multipath control byte for all devices on the attached hba ++ * ++ * Input: ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_set_target_data(EXT_IOCTL *pext, FO_TARGET_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ int i; ++ int ret = 0; ++ mp_host_t *host; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ uint16_t dev_no; ++ uint8_t path_id; ++ FO_DEVICE_DATA *entry, *u_entry; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ ++ if (!ha->flags.failover_enabled) ++ /* non-failover mode. nothing to be done. */ ++ return 0; ++ ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ entry = (FO_DEVICE_DATA *)qla2x00_kmem_zalloc( ++ sizeof(FO_DEVICE_DATA), GFP_ATOMIC, 15); ++ if (entry == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_DEVICE_DATA));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ u_entry = (FO_DEVICE_DATA *)(pext->RequestAdr + ++ sizeof(FO_TARGET_DATA_INPUT)); ++ ++ for (i = 0; i < MAX_TARGETS; i++, u_entry++) { ++ ret = verify_area(VERIFY_READ, (void *)u_entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p verify read err.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_from_user(entry, u_entry, sizeof(FO_DEVICE_DATA)); ++ ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p copy error.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path= path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ path->mp_byte = entry->MultipathControl; ++ ++ DEBUG9(printk("cfg_set_target_data: %d target " ++ "data = 0x%x \n", ++ path->id,path->mp_byte);) ++ ++ /* ++ * If this is the visible path, then make it ++ * available on next reboot. ++ */ ++ if (!((path->mp_byte & MP_MASK_HIDDEN) || ++ (path->mp_byte & MP_MASK_UNCONFIGURED))) { ++ pathlist->visible = path->id; ++ } ++ ++ /* Found path. Go to next entry. */ ++ break; ++ } ++ break; ++ } ++ } ++ ++ KMEM_FREE(entry, sizeof(FO_DEVICE_DATA)); ++ ++ DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);) ++ ++ return (ret); ++ ++} ++ ++/* ++ * qla2x00_fo_ioctl ++ * Provides functions for failover ioctl() calls. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ioctl_code = ioctl function to perform ++ * arg = Address of application EXT_IOCTL cmd data ++ * mode = flags ++ * ++ * Returns: ++ * Return value is the ioctl rval_p return value. ++ * 0 = success ++ * ++ * Context: ++ * Kernel context. ++ */ ++/* ARGSUSED */ ++int ++qla2x00_fo_ioctl(scsi_qla_host_t *ha, int ioctl_code, void *ret_arg, int mode) ++{ ++ static EXT_IOCTL cmd_struct; ++ int rval = 0; ++ size_t in_size, out_size; ++ static union { ++ FO_PARAMS params; ++ FO_GET_PATHS path; ++ FO_SET_CURRENT_PATH set_path; ++ /* FO_HBA_STAT_INPUT stat; */ ++ FO_HBA_STAT stat; ++ FO_LUN_DATA_INPUT lun_data; ++ FO_TARGET_DATA_INPUT target_data; ++ } buff; ++ ++ ++ ENTER("qla2x00_fo_ioctl"); ++ DEBUG9(printk("%s: entered. arg (%p):\n", __func__, ret_arg);) ++ ++ memcpy(&cmd_struct, ret_arg, sizeof(cmd_struct)); ++ ++ /* ++ * default case for this switch not needed, ++ * ioctl_code validated by caller. ++ */ ++ in_size = out_size = 0; ++ switch (ioctl_code) { ++ case FO_CC_GET_PARAMS: ++ out_size = sizeof(FO_PARAMS); ++ break; ++ case FO_CC_SET_PARAMS: ++ in_size = sizeof(FO_PARAMS); ++ break; ++ case FO_CC_GET_PATHS: ++ in_size = sizeof(FO_GET_PATHS); ++ break; ++ case FO_CC_SET_CURRENT_PATH: ++ in_size = sizeof(FO_SET_CURRENT_PATH); ++ break; ++ case FO_CC_GET_HBA_STAT: ++ case FO_CC_RESET_HBA_STAT: ++ in_size = sizeof(FO_HBA_STAT_INPUT); ++ break; ++ case FO_CC_GET_LUN_DATA: ++ in_size = sizeof(FO_LUN_DATA_INPUT); ++ break; ++ case FO_CC_SET_LUN_DATA: ++ in_size = sizeof(FO_LUN_DATA_INPUT); ++ break; ++ case FO_CC_GET_TARGET_DATA: ++ in_size = sizeof(FO_TARGET_DATA_INPUT); ++ break; ++ case FO_CC_SET_TARGET_DATA: ++ in_size = sizeof(FO_TARGET_DATA_INPUT); ++ break; ++ ++ } ++ if (in_size != 0) { ++ if ((int)cmd_struct.RequestLen < in_size) { ++ cmd_struct.Status = EXT_STATUS_INVALID_PARAM; ++ cmd_struct.DetailStatus = EXT_DSTATUS_REQUEST_LEN; ++ DEBUG10(printk("%s: got invalie req len (%d).\n", ++ __func__, cmd_struct.RequestLen);) ++ ++ } else { ++ ++ rval = verify_area(VERIFY_READ, ++ (void *)cmd_struct.RequestAdr, in_size); ++ if (rval) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: req buf verify read " ++ "error. size=%d.\n", ++ __func__, in_size);) ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } ++ rval = copy_from_user(&buff, ++ (void *)cmd_struct.RequestAdr, in_size); ++ ++ if (rval) { ++ DEBUG2_9_10(printk("%s: req buf copy error. " ++ "size=%d.\n", ++ __func__, in_size);) ++ ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } else { ++ DEBUG9(printk("qla2x00_fo_ioctl: req buf " ++ "copied ok.\n")); ++ } ++ } ++ } else if (out_size != 0 && (int)cmd_struct.ResponseLen < out_size) { ++ cmd_struct.Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ cmd_struct.DetailStatus = out_size; ++ DEBUG10(printk("%s: got invalie resp len (%d).\n", ++ __func__, cmd_struct.ResponseLen);) ++ } ++ ++ if (rval != 0 || cmd_struct.Status != 0) ++ goto done_fo_ioctl; ++ ++ cmd_struct.Status = EXT_STATUS_OK; ++ cmd_struct.DetailStatus = EXT_STATUS_OK; ++ ++ switch (ioctl_code) { ++ case FO_CC_GET_PARAMS: ++ rval = qla2x00_fo_get_params(&buff.params); ++ break; ++ case FO_CC_SET_PARAMS: ++ rval = qla2x00_fo_set_params(&buff.params); ++ break; ++ case FO_CC_GET_PATHS: ++ rval = qla2x00_cfg_get_paths(&cmd_struct, ++ &buff.path,mode); ++ if (rval != 0) ++ out_size = 0; ++ break; ++ case FO_CC_SET_CURRENT_PATH: ++ rval = qla2x00_cfg_set_current_path(&cmd_struct, ++ &buff.set_path,mode); ++ break; ++ case FO_CC_RESET_HBA_STAT: ++ rval = qla2x00_fo_stats(&buff.stat, TRUE); ++ break; ++ case FO_CC_GET_HBA_STAT: ++ rval = qla2x00_fo_stats(&buff.stat, FALSE); ++ break; ++ case FO_CC_GET_LUN_DATA: ++ ++ DEBUG4(printk("calling qla2x00_fo_get_lun_data\n");) ++ DEBUG4(printk("cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ ++ rval = qla2x00_fo_get_lun_data(&cmd_struct, ++ &buff.lun_data, mode); ++ ++ if (rval != 0) ++ out_size = 0; ++ break; ++ case FO_CC_SET_LUN_DATA: ++ ++ DEBUG4(printk("calling qla2x00_fo_set_lun_data\n");) ++ DEBUG4(printk(" cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ ++ rval = qla2x00_fo_set_lun_data(&cmd_struct, ++ &buff.lun_data, mode); ++ break; ++ case FO_CC_GET_TARGET_DATA: ++ DEBUG4(printk("calling qla2x00_fo_get_target_data\n");) ++ DEBUG4(printk("cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ ++ rval = qla2x00_fo_get_target_data(&cmd_struct, ++ &buff.target_data, mode); ++ ++ if (rval != 0) { ++ out_size = 0; ++ } ++ break; ++ case FO_CC_SET_TARGET_DATA: ++ DEBUG4(printk("calling qla2x00_fo_set_target_data\n");) ++ DEBUG4(printk(" cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ rval = qla2x00_fo_set_target_data(&cmd_struct, ++ &buff.target_data, mode); ++ break; ++ ++ } ++ ++ if (rval == 0 && (cmd_struct.ResponseLen = out_size) != 0) { ++ rval = verify_area(VERIFY_WRITE, (void *)cmd_struct.ResponseAdr, ++ out_size); ++ if (rval != 0) { ++ DEBUG10(printk("%s: resp buf very write error.\n", ++ __func__);) ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } ++ } ++ ++ if (rval == 0) { ++ rval = copy_to_user((void *)cmd_struct.ResponseAdr, ++ &buff, out_size); ++ ++ if (rval != 0) { ++ DEBUG10(printk("%s: resp buf copy error. size=%d.\n", ++ __func__, out_size);) ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } ++ } ++ ++done_fo_ioctl: ++ ++ /* Set Status and DetailStatus fields in application EXT_IOCTL */ ++ (((EXT_IOCTL*)ret_arg)->Status) = cmd_struct.Status; ++ (((EXT_IOCTL*)ret_arg)->DetailStatus) = cmd_struct.DetailStatus; ++ (((EXT_IOCTL*)ret_arg)->ResponseLen) = cmd_struct.ResponseLen; ++ ++ if (rval != 0) { ++ /*EMPTY*/ ++ DEBUG10(printk("%s: **** FAILED ****\n", __func__);) ++ } else { ++ /*EMPTY*/ ++ DEBUG9(printk("%s: exiting normally\n", __func__);) ++ } ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2x00_fo_count_retries ++ * Increment the retry counter for the command. ++ * Set or reset the SRB_RETRY flag. ++ * ++ * Input: ++ * sp = Pointer to command. ++ * ++ * Returns: ++ * TRUE -- retry ++ * FALSE -- don't retry ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_fo_count_retries(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ uint8_t retry = TRUE; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (++sp->fo_retry_cnt > qla_fo_params.MaxRetriesPerIo) { ++ /* no more failovers for this request */ ++ retry = FALSE; ++ sp->fo_retry_cnt = 0; ++ printk(KERN_INFO ++ "qla2x00: no more failovers for request - " ++ "pid= %ld\n", sp->cmd->serial_number); ++ } else { ++ /* ++ * We haven't exceeded the max retries for this request, check ++ * max retries this path ++ */ ++ if ((sp->fo_retry_cnt % qla_fo_params.MaxRetriesPerPath) == 0) { ++ DEBUG(printk(" qla2x00_fo_count_retries: FAILOVER - " ++ "queuing ha=%ld, sp=%p, pid =%ld, " ++ "fo retry= %d \n", ++ ha->host_no, ++ sp, sp->cmd->serial_number, ++ sp->fo_retry_cnt);) ++ ++ /* ++ * Note: we don't want it to timeout, so it is ++ * recycling on the retry queue and the fialover queue. ++ */ ++ lq = sp->lun_queue; ++ tq = sp->tgt_queue; ++ set_bit(LUN_MPIO_BUSY, &lq->q_flag); ++ ++ /* ++ * ??? We can get a path error on any ha, but always ++ * queue failover on originating ha. This will allow us ++ * to syncronized the requests for a given lun. ++ */ ++ sp->f_start=jiffies;/*ra 10/29/01*/ ++ /* Now queue it on to be failover */ ++ sp->ha = ha; ++ add_to_failover_queue(ha,sp); ++ } ++ } ++ ++ DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);) ++ ++ return retry ; ++} ++ ++ ++/* ++ * qla2x00_fo_check ++ * This function is called from the done routine to see if ++ * the SRB requires a failover. ++ * ++ * This function examines the available os returned status and ++ * if meets condition, the command(srb) is placed ont the failover ++ * queue for processing. ++ * ++ * Input: ++ * sp = Pointer to the SCSI Request Block ++ * ++ * Output: ++ * sp->flags SRB_RETRY bit id command is to ++ * be retried otherwise bit is reset. ++ * ++ * Returns: ++ * None. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ */ ++uint8_t ++qla2x00_fo_check(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ uint8_t retry = FALSE; ++ int host_status; ++#if DEBUG_QLA2100 ++ static char *reason[] = { ++ "DID_OK", ++ "DID_NO_CONNECT", ++ "DID_BUS_BUSY", ++ "DID_TIME_OUT", ++ "DID_BAD_TARGET", ++ "DID_ABORT", ++ "DID_PARITY", ++ "DID_ERROR", ++ "DID_RESET", ++ "DID_BAD_INTR" ++ }; ++#endif ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ /* we failover on selction timeouts only */ ++ host_status = CMD_RESULT(sp->cmd) >>16; ++ if( host_status == DID_NO_CONNECT) { ++ if( qla2x00_fo_count_retries(ha,sp) ) { ++ /* Force a retry on this request, it will ++ * cause the LINUX timer to get reset, while we ++ * we are processing the failover. ++ */ ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ retry = TRUE; ++ } ++ DEBUG(printk("qla2x00_fo_check: pid= %ld sp %p " ++ "retry count=%d, retry flag = %d, " ++ "host status (%s)\n\r", ++ sp->cmd->serial_number, ++ sp, sp->fo_retry_cnt, ++ retry, reason[host_status]);) ++ } ++ ++ DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);) ++ ++ return retry; ++} ++ ++/* ++ * qla2x00_fo_path_change ++ * This function is called from configuration mgr to notify ++ * of a path change. ++ * ++ * Input: ++ * type = Failover notify type, FO_NOTIFY_LUN_RESET or FO_NOTIFY_LOGOUT ++ * newlunp = Pointer to the fc_lun struct for current path. ++ * oldlunp = Pointer to fc_lun struct for previous path. ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint32_t ++qla2x00_fo_path_change(uint32_t type, fc_lun_t *newlunp, fc_lun_t *oldlunp) ++{ ++ uint32_t ret = QLA2X00_SUCCESS; ++ ++ newlunp->max_path_retries = 0; ++ return ret; ++} ++ ++/* ++ * qla2x00_fo_get_params ++ * Process an ioctl request to get system wide failover parameters. ++ * ++ * Input: ++ * pp = Pointer to FO_PARAMS structure. ++ * ++ * Returns: ++ * EXT_STATUS code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_fo_get_params(PFO_PARAMS pp) ++{ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ pp->MaxPathsPerDevice = qla_fo_params.MaxPathsPerDevice; ++ pp->MaxRetriesPerPath = qla_fo_params.MaxRetriesPerPath; ++ pp->MaxRetriesPerIo = qla_fo_params.MaxRetriesPerIo; ++ pp->Flags = qla_fo_params.Flags; ++ pp->FailoverNotifyType = qla_fo_params.FailoverNotifyType; ++ pp->FailoverNotifyCdbLength = qla_fo_params.FailoverNotifyCdbLength; ++ memset(pp->FailoverNotifyCdb, 0, sizeof(pp->FailoverNotifyCdb)); ++ memcpy(pp->FailoverNotifyCdb, ++ &qla_fo_params.FailoverNotifyCdb[0], sizeof(pp->FailoverNotifyCdb)); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return EXT_STATUS_OK; ++} ++ ++/* ++ * qla2x00_fo_set_params ++ * Process an ioctl request to set system wide failover parameters. ++ * ++ * Input: ++ * pp = Pointer to FO_PARAMS structure. ++ * ++ * Returns: ++ * EXT_STATUS code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_fo_set_params(PFO_PARAMS pp) ++{ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ /* Check values for defined MIN and MAX */ ++ if ((pp->MaxPathsPerDevice > SDM_DEF_MAX_PATHS_PER_DEVICE) || ++ (pp->MaxRetriesPerPath < FO_MAX_RETRIES_PER_PATH_MIN) || ++ (pp->MaxRetriesPerPath > FO_MAX_RETRIES_PER_PATH_MAX) || ++ (pp->MaxRetriesPerIo < FO_MAX_RETRIES_PER_IO_MIN) || ++ (pp->MaxRetriesPerPath > FO_MAX_RETRIES_PER_IO_MAX)) { ++ DEBUG2_9_10(printk("%s: got invalid params.\n", __func__);) ++ return EXT_STATUS_INVALID_PARAM; ++ } ++ ++ /* Update the global structure. */ ++ qla_fo_params.MaxPathsPerDevice = pp->MaxPathsPerDevice; ++ qla_fo_params.MaxRetriesPerPath = pp->MaxRetriesPerPath; ++ qla_fo_params.MaxRetriesPerIo = pp->MaxRetriesPerIo; ++ qla_fo_params.Flags = pp->Flags; ++ qla_fo_params.FailoverNotifyType = pp->FailoverNotifyType; ++ qla_fo_params.FailoverNotifyCdbLength = pp->FailoverNotifyCdbLength; ++ if (pp->FailoverNotifyType & FO_NOTIFY_TYPE_CDB) { ++ if (pp->FailoverNotifyCdbLength > ++ sizeof(qla_fo_params.FailoverNotifyCdb)) { ++ DEBUG2_9_10(printk("%s: got invalid cdb length.\n", ++ __func__);) ++ return EXT_STATUS_INVALID_PARAM; ++ } ++ ++ memcpy(qla_fo_params.FailoverNotifyCdb, ++ pp->FailoverNotifyCdb, ++ sizeof(qla_fo_params.FailoverNotifyCdb)); ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return EXT_STATUS_OK; ++} ++ ++ ++/* ++ * qla2x00_fo_init_params ++ * Gets driver configuration file failover properties to initalize ++ * the global failover parameters structure. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_fo_init_params(scsi_qla_host_t *ha) ++{ ++ DEBUG3(printk("%s: entered.\n", __func__);) ++ ++ /* For parameters that are not completely implemented yet, */ ++ ++ memset(&qla_fo_params, 0, sizeof(qla_fo_params)); ++ ++ if(MaxPathsPerDevice) { ++ qla_fo_params.MaxPathsPerDevice = MaxPathsPerDevice; ++ } else ++ qla_fo_params.MaxPathsPerDevice =FO_MAX_PATHS_PER_DEVICE_DEF ; ++ if(MaxRetriesPerPath) { ++ qla_fo_params.MaxRetriesPerPath = MaxRetriesPerPath; ++ } else ++ qla_fo_params.MaxRetriesPerPath =FO_MAX_RETRIES_PER_PATH_DEF; ++ if(MaxRetriesPerIo) { ++ qla_fo_params.MaxRetriesPerIo =MaxRetriesPerIo; ++ } else ++ qla_fo_params.MaxRetriesPerIo =FO_MAX_RETRIES_PER_IO_DEF; ++ ++ qla_fo_params.Flags = 0; ++ qla_fo_params.FailoverNotifyType = FO_NOTIFY_TYPE_NONE; ++ ++ DEBUG3(printk("%s: exiting.\n", __func__);) ++ ++} ++ ++/* ++ * qla2x00_send_fo_notification ++ * Sends failover notification if needed. Change the fc_lun pointer ++ * in the old path lun queue. ++ * ++ * Input: ++ * old_lp = Pointer to old fc_lun. ++ * new_lp = Pointer to new fc_lun. ++ * ++ * Returns: ++ * Local function status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint32_t ++qla2x00_send_fo_notification(fc_lun_t *old_lp, fc_lun_t *new_lp) ++{ ++ scsi_qla_host_t *old_ha = old_lp->fcport->ha; ++ int rval = QLA2X00_SUCCESS; ++ inq_cmd_rsp_t *pkt; ++ uint16_t loop_id, lun; ++ dma_addr_t phys_address; ++ ++ ++ ENTER("qla2x00_send_fo_notification"); ++ DEBUG3(printk("%s: entered.\n", __func__);) ++ ++ loop_id = old_lp->fcport->loop_id; ++ lun = old_lp->lun; ++ ++ if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_LUN_RESET) { ++ rval = qla2x00_lun_reset(old_ha, loop_id, lun); ++ if (rval == QLA2X00_SUCCESS) { ++ DEBUG4(printk("qla2x00_send_fo_notification: LUN " ++ "reset succeded\n");) ++ } else { ++ DEBUG4(printk("qla2x00_send_fo_notification: LUN " ++ "reset failed\n");) ++ } ++ ++ } ++ if ( (qla_fo_params.FailoverNotifyType == ++ FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET) || ++ (qla_fo_params.FailoverNotifyType == ++ FO_NOTIFY_TYPE_LOGOUT_OR_CDB) ) { ++ ++ rval = qla2x00_fabric_logout(old_ha, loop_id); ++ if (rval == QLA2X00_SUCCESS) { ++ DEBUG4(printk("qla2x00_send_fo_failover_notify: " ++ "logout succeded\n");) ++ } else { ++ DEBUG4(printk("qla2x00_send_fo_failover_notify: " ++ "logout failed\n");) ++ } ++ ++ } ++ ++ if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB) { ++ pkt = pci_alloc_consistent(old_ha->pdev, ++ sizeof(inq_cmd_rsp_t), &phys_address); ++ if (pkt == NULL) { ++ DEBUG4(printk("qla2x00_send_fo_failover_notify: " ++ "memory allocation failed\n");) ++ ++ return(QLA2X00_FUNCTION_FAILED); ++ } ++ ++ memset(pkt,0, sizeof(inq_cmd_rsp_t)); ++ pkt->p.cmd.entry_type = COMMAND_A64_TYPE; ++ pkt->p.cmd.entry_count = 1; ++ pkt->p.cmd.lun = lun; ++ pkt->p.cmd.target = (uint8_t)loop_id; ++ pkt->p.cmd.control_flags = CF_SIMPLE_TAG; ++ memcpy(pkt->p.cmd.scsi_cdb, ++ qla_fo_params.FailoverNotifyCdb, ++ qla_fo_params.FailoverNotifyCdbLength); ++ /* FIXME This setup needs to be verified with Dennis. */ ++ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1); ++ pkt->p.cmd.byte_count = __constant_cpu_to_le32(0); ++ pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( ++ LSD(phys_address + sizeof (sts_entry_t))); ++ pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( ++ MSD(phys_address + sizeof (sts_entry_t))); ++ pkt->p.cmd.dseg_0_length = __constant_cpu_to_le32(0); ++ ++ rval = qla2x00_issue_iocb(old_ha, ++ pkt, phys_address, sizeof (inq_cmd_rsp_t)); ++ ++ if (rval != QLA2X00_SUCCESS || ++ pkt->p.rsp.comp_status != CS_COMPLETE || ++ pkt->p.rsp.scsi_status & SS_CHECK_CONDITION || ++ pkt->inq[0] == 0x7f) { ++ ++ DEBUG4(printk("qla2x00_fo_notification: send CDB " ++ "failed: comp_status = %x" ++ "scsi_status = %x inq[0] = %x\n", ++ pkt->p.rsp.comp_status, ++ pkt->p.rsp.scsi_status, ++ pkt->inq[0]);) ++ } ++ ++ pci_free_consistent(old_ha->pdev, ++ sizeof(inq_cmd_rsp_t), pkt, phys_address); ++ } ++ ++ DEBUG3(printk("%s: exiting. rval = %d.\n", __func__, rval);) ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2100_fo_enabled ++ * Reads and validates the failover enabled property. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * instance = HBA number. ++ * ++ * Returns: ++ * TRUE when failover is authorized else FALSE ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint8_t ++qla2x00_fo_enabled(scsi_qla_host_t *ha, int instance) ++{ ++ uint8_t enable = FALSE; ++ ++ if (ha->flags.failover_enabled) ++ enable = TRUE; ++ ++ return enable; ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.cfg Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,31 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.4.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support Driver ++ */ ++int MaxPathsPerDevice = 0; ++int MaxRetriesPerPath =0 ; ++int MaxRetriesPerIo =0; ++#if defined(MODULE) ++/* insmod qla2100 <options> ql2xopts=<string> */ ++MODULE_PARM(MaxPathsPerDevice, "i"); ++MODULE_PARM(MaxRetriesPerPath, "i"); ++MODULE_PARM(MaxRetriesPerIo, "i"); ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,75 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Failover Header ++ * ++ */ ++#ifndef _QLA_FO_H ++#define _QLA_FO_H ++ ++#if defined(__cplusplus) ++extern "C" ++{ ++#endif ++ ++#include "qlfo.h" ++ /* ++ * This structure definition is for a scsi I/O request NOT subject to ++ * failover re-routing. It is for the use of configuration operations ++ * and diagnostics functions as definted in ExIoct.h ++ */ ++ typedef struct scsi_cdb_request { ++ struct adapter_state *ha; ++ uint16_t target; ++ uint16_t lun; ++ uint8_t *cdb_ptr; /* Pointer to cdb to be sent */ ++ uint8_t cdb_len; /* cdb length */ ++ uint8_t direction; /* Direction of I/O for buffer */ ++ uint8_t scb_len; /* Scsi completion block length */ ++ uint8_t *scb_ptr; /* Scsi completion block pointer */ ++ uint8_t *buf_ptr; /* Pointer to I/O buffer */ ++ uint16_t buf_len; /* Buffer size */ ++ } ++ SCSI_REQ_t, *SCSI_REQ_p; ++ ++ ++ /* ++ * Special defines ++ */ ++ typedef union _FO_HBA_STAT { ++ FO_HBA_STAT_INPUT input; ++ FO_HBA_STAT_INFO info; ++ } FO_HBA_STAT; ++ ++ typedef union _FO_LUN_DATA { ++ FO_LUN_DATA_INPUT input; ++ FO_LUN_DATA_LIST list; ++ } FO_LUN_DATA; ++ ++ typedef union _FO_TARGET_DATA { ++ FO_TARGET_DATA_INPUT input; ++ FO_DEVICE_DATABASE list; ++ } FO_TARGET_DATA; ++ ++#if defined(__cplusplus) ++} ++#endif ++ ++#endif /* ifndef _QLA_FO_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_gbl.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,395 @@ ++/******************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 Qlogic Corporation ++* (www.qlogic.com) ++* ++* 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. ++* ++****************************************************************************** ++* Global include file. ++******************************************************************************/ ++ ++ ++#ifndef __QLA_GBL_H ++#define __QLA_GBL_H ++ ++/* ++ * Global Data in FW files. ++ */ ++extern unsigned char fw2100tp_version[]; ++extern unsigned char fw2100tp_version_str[]; ++extern unsigned short fw2100tp_addr01; ++extern unsigned short fw2100tp_code01[]; ++extern unsigned short fw2100tp_length01; ++ ++extern unsigned char fw2200ip_version[]; ++extern unsigned char fw2200ip_version_str[]; ++extern unsigned short fw2200ip_addr01; ++extern unsigned short fw2200ip_code01[]; ++extern unsigned short fw2200ip_length01; ++ ++extern unsigned char fw2300tpx_version[]; ++extern unsigned char fw2300tpx_version_str[]; ++extern unsigned short fw2300tpx_addr01; ++extern unsigned short fw2300tpx_code01[]; ++extern unsigned short fw2300tpx_length01; ++ ++extern unsigned char fw2300ipx_version[]; ++extern unsigned char fw2300ipx_version_str[]; ++extern unsigned short fw2300ipx_addr01; ++extern unsigned short fw2300ipx_code01[]; ++extern unsigned short fw2300ipx_length01; ++ ++#if defined(ISP2322) ++extern unsigned char fw2322tpx_version[]; ++extern unsigned char fw2322tpx_version_str[]; ++extern unsigned short fw2322tpx_addr01; ++extern unsigned short fw2322tpx_code01[]; ++extern unsigned short fw2322tpx_length01; ++extern unsigned long rseqtpx_code_addr01; ++extern unsigned short rseqtpx_code01[]; ++extern unsigned short rseqtpx_code_length01; ++extern unsigned long xseqtpx_code_addr01; ++extern unsigned short xseqtpx_code01[]; ++extern unsigned short xseqtpx_code_length01; ++ ++extern unsigned char fw2322ipx_version[]; ++extern unsigned char fw2322ipx_version_str[]; ++extern unsigned short fw2322ipx_addr01; ++extern unsigned short fw2322ipx_code01[]; ++extern unsigned short fw2322ipx_length01; ++extern unsigned long rseqipx_code_addr01; ++extern unsigned short rseqipx_code01[]; ++extern unsigned short rseqipx_code_length01; ++extern unsigned long xseqipx_code_addr01; ++extern unsigned short xseqipx_code01[]; ++extern unsigned short xseqipx_code_length01; ++#endif ++ ++/* ++ * Global Function Prototypes in qla_init.c source file. ++ */ ++extern uint8_t qla2x00_initialize_adapter(scsi_qla_host_t *); ++extern uint8_t qla2x00_loop_resync(scsi_qla_host_t *); ++extern void qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t); ++extern uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *); ++extern uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_t); ++ ++extern void qla2x00_restart_queues(scsi_qla_host_t *, uint8_t); ++ ++extern os_tgt_t *qla2x00_tgt_alloc(scsi_qla_host_t *, uint16_t); ++extern os_lun_t * qla2x00_lun_alloc(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++extern uint8_t qla2x00_abort_isp(scsi_qla_host_t *, uint8_t); ++ ++ ++/* ++ * Global Data in qla_os.c source file. ++ */ ++extern char qla2x00_version_str[]; ++extern unsigned long qla2x00_verbose; ++extern unsigned long qla2x00_quiet; ++extern unsigned long qla2x00_reinit; ++extern unsigned long qla2x00_req_dmp; ++ ++extern int num_hosts; ++extern int apiHBAInstance; ++ ++extern struct _qla2x00stats qla2x00_stats; ++extern char *ql2xdevconf; ++extern int ql2xretrycount; ++extern int qla2xenbinq; ++extern int max_srbs; ++#if defined(ISP2200) || defined(ISP2300) ++extern int ql2xlogintimeout; ++extern int qlport_down_retry; ++#endif ++extern int ql2xmaxqdepth; ++extern int displayConfig; ++ ++extern int ql2xfailover; ++ ++extern int ConfigRequired; ++extern int recoveryTime; ++extern int failbackTime; ++ ++extern int Bind; ++extern int ql2xsuspendcount; ++extern int qla2x00_retryq_dmp; ++#if defined(MODULE) ++extern char *ql2xopts; ++#endif ++extern struct list_head qla_hostlist; ++extern rwlock_t qla_hostlist_lock; ++ ++extern int qla2x00_queuecommand(Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); ++ ++extern uint8_t ++__qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int, int); ++ ++extern int qla2x00_done(scsi_qla_host_t *); ++extern void qla2x00_next(scsi_qla_host_t *); ++extern void qla2x00_flush_failover_q(scsi_qla_host_t *, os_lun_t *); ++extern void qla2x00_reset_lun_fo_counts(scsi_qla_host_t *, os_lun_t *); ++ ++extern uint8_t qla2x00_check_tgt_status(scsi_qla_host_t *, Scsi_Cmnd *); ++extern uint8_t qla2x00_check_port_status(scsi_qla_host_t *, fc_port_t *); ++ ++extern void qla2x00_extend_timeout(Scsi_Cmnd *, int); ++extern srb_t * qla2x00_get_new_sp (scsi_qla_host_t *ha); ++ ++extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *); ++extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *); ++ ++extern int qla2x00_get_prop_xstr(scsi_qla_host_t *, char *, uint8_t *, int); ++ ++extern void qla2x00_abort_queues(scsi_qla_host_t *, uint8_t); ++ ++/* ++ * Global Function Prototypes in qla_iocb.c source file. ++ */ ++extern request_t *qla2x00_req_pkt(scsi_qla_host_t *); ++extern request_t *qla2x00_ms_req_pkt(scsi_qla_host_t *, srb_t *); ++extern void qla2x00_isp_cmd(scsi_qla_host_t *); ++extern int qla2x00_start_scsi(srb_t *sp); ++int qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t); ++int __qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t); ++ ++/* ++ * Global Function Prototypes in qla_mbx.c source file. ++ */ ++extern uint8_t ++qla2x00_mailbox_command(scsi_qla_host_t *, mbx_cmd_t *); ++ ++extern int ++qla2x00_load_ram(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t); ++ ++extern int ++qla2x00_load_ram_ext(scsi_qla_host_t *, dma_addr_t, uint32_t, uint16_t); ++ ++extern int ++qla2x00_execute_fw(scsi_qla_host_t *); ++ ++extern void ++qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, ++ uint16_t *, uint16_t *, uint16_t *); ++ ++extern int ++qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *); ++ ++extern int ++qla2x00_set_fw_options(scsi_qla_host_t *, ++ uint16_t, uint16_t, uint16_t, uint16_t, uint16_t); ++ ++extern int ++qla2x00_read_ram_word(scsi_qla_host_t *, uint16_t, uint16_t *); ++extern int ++qla2x00_write_ram_word(scsi_qla_host_t *, uint16_t, uint16_t); ++extern int ++qla2x00_write_ram_word_ext(scsi_qla_host_t *, uint32_t, uint16_t); ++ ++extern int ++qla2x00_mbx_reg_test(scsi_qla_host_t *); ++ ++extern int ++qla2x00_verify_checksum(scsi_qla_host_t *); ++ ++extern int ++qla2x00_issue_iocb(scsi_qla_host_t *, void *, dma_addr_t, size_t); ++ ++extern int ++qla2x00_abort_command(scsi_qla_host_t *, srb_t *); ++ ++extern int ++qla2x00_abort_device(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++#if USE_ABORT_TGT ++extern int ++qla2x00_abort_target(fc_port_t *fcport); ++#endif ++ ++extern int ++qla2x00_target_reset(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++extern int ++qla2x00_get_adapter_id(scsi_qla_host_t *, uint16_t *, uint8_t *, uint8_t *, ++ uint8_t *, uint16_t *); ++ ++extern int ++qla2x00_get_retry_cnt(scsi_qla_host_t *, uint8_t *, uint8_t *); ++ ++int ++qla2x00_loopback_test(scsi_qla_host_t *, INT_LOOPBACK_REQ *, uint16_t *); ++ ++extern int ++qla2x00_init_firmware(scsi_qla_host_t *, uint16_t); ++ ++extern int ++qla2x00_get_port_database(scsi_qla_host_t *, fcdev_t *, uint8_t); ++ ++extern int ++qla2x00_get_firmware_state(scsi_qla_host_t *, uint16_t *); ++ ++extern int ++qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t); ++ ++extern uint8_t ++qla2x00_get_link_status(scsi_qla_host_t *, uint8_t, void *, uint16_t *); ++ ++extern int ++qla2x00_lip_reset(scsi_qla_host_t *); ++ ++extern int ++qla2x00_send_sns(scsi_qla_host_t *, dma_addr_t, uint16_t, size_t); ++ ++extern int ++qla2x00_login_fabric(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t, ++ uint16_t *, uint8_t); ++ ++extern int ++qla2x00_login_local_device(scsi_qla_host_t *, uint16_t, uint16_t *, uint8_t); ++ ++extern int ++qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id); ++ ++extern int ++qla2x00_full_login_lip(scsi_qla_host_t *ha); ++ ++extern int ++qla2x00_get_port_list(scsi_qla_host_t *, port_list_entry_t *, dma_addr_t, ++ uint16_t, uint16_t *); ++ ++#if 0 /* not yet needed */ ++extern int ++qla2x00_dump_ram(scsi_qla_host_t *, uint32_t, dma_addr_t, uint32_t); ++#endif ++ ++extern int ++qla2x00_lun_reset(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++extern int ++qla2x00_send_rnid_mbx(scsi_qla_host_t *, uint16_t, uint8_t, dma_addr_t, ++ size_t, uint16_t *); ++ ++extern int ++qla2x00_set_rnid_params_mbx(scsi_qla_host_t *, dma_addr_t, size_t, uint16_t *); ++ ++extern int ++qla2x00_get_rnid_params_mbx(scsi_qla_host_t *, dma_addr_t, size_t, uint16_t *); ++ ++#if defined(QL_DEBUG_LEVEL_3) ++extern int ++qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map); ++#endif ++ ++/* ++ * Global Data in qla_fo.c source file. ++ */ ++extern SysFoParams_t qla_fo_params; ++ ++/* ++ * Global Function Prototypes in qla_fo.c source file. ++ */ ++extern scsi_qla_host_t *qla2x00_get_hba(int); ++extern uint32_t qla2x00_send_fo_notification(fc_lun_t *fclun_p, fc_lun_t *olun_p); ++extern void qla2x00_fo_init_params(scsi_qla_host_t *ha); ++extern uint8_t qla2x00_fo_enabled(scsi_qla_host_t *ha, int instance); ++ ++/* ++ * Global Data in qla_cfg.c source file. ++ */ ++extern mp_host_t *mp_hosts_base; ++extern uint8_t mp_config_required; ++/* ++ * Global Function Prototypes in qla_cfg.c source file. ++ */ ++extern mp_host_t * qla2x00_cfg_find_host(scsi_qla_host_t *); ++extern uint8_t qla2x00_is_portname_in_device(mp_device_t *, uint8_t *); ++extern int qla2x00_cfg_init (scsi_qla_host_t *ha); ++extern int qla2x00_cfg_path_discovery(scsi_qla_host_t *ha); ++extern int qla2x00_cfg_event_notify(scsi_qla_host_t *ha, uint32_t i_type); ++extern fc_lun_t *qla2x00_cfg_failover(scsi_qla_host_t *ha, fc_lun_t *fp, ++ os_tgt_t *tgt, srb_t *sp); ++extern int qla2x00_cfg_get_paths( EXT_IOCTL *, FO_GET_PATHS *, int); ++extern int qla2x00_cfg_set_current_path( EXT_IOCTL *, ++ FO_SET_CURRENT_PATH *, int); ++extern void qla2x00_fo_properties(scsi_qla_host_t *ha); ++extern mp_host_t * qla2x00_add_mp_host(uint8_t *); ++extern void qla2x00_cfg_mem_free(scsi_qla_host_t *ha); ++extern mp_host_t * qla2x00_alloc_host(scsi_qla_host_t *); ++extern uint8_t qla2x00_fo_check(scsi_qla_host_t *ha, srb_t *sp); ++extern mp_path_t *qla2x00_find_path_by_name(mp_host_t *, mp_path_list_t *, ++ uint8_t *name); ++ ++/* ++ * Global Function Prototypes in qla_cfgln.c source file. ++ */ ++extern void qla2x00_cfg_build_path_tree( scsi_qla_host_t *ha); ++extern uint8_t qla2x00_update_mp_device(mp_host_t *, ++ fc_port_t *, uint16_t ); ++extern void qla2x00_cfg_display_devices(void); ++ ++/* ++ * Global Function Prototypes in qla_xioctl.c source file. ++ */ ++extern void qla2x00_enqueue_aen(scsi_qla_host_t *, uint16_t, void *); ++extern int qla2x00_fo_ioctl(scsi_qla_host_t *, int, void *, int); ++extern int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *); ++extern void qla2x00_free_ioctl_mem(scsi_qla_host_t *); ++extern int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t); ++extern void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *); ++ ++/* ++ * Global Function Prototypes in qla_inioctl.c source file. ++ */ ++extern int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t); ++extern int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++ ++/* ++ * Global Function Prototypes in qla_isr.c source file. ++ */ ++extern irqreturn_t qla2x00_intr_handler(int, void *, struct pt_regs *); ++ ++ ++/* ++ * Global Function Prototypes in qla_sup.c source file. ++ */ ++extern uint16_t qla2x00_get_nvram_word(scsi_qla_host_t *, uint32_t); ++extern void qla2x00_nv_write(scsi_qla_host_t *, uint16_t); ++extern void qla2x00_nv_deselect(scsi_qla_host_t *); ++extern uint8_t qla2x00_read_flash_byte(scsi_qla_host_t *, uint32_t); ++extern uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *); ++extern uint16_t qla2x00_get_flash_version(scsi_qla_host_t *); ++extern uint16_t qla2x00_get_flash_image(scsi_qla_host_t *, uint8_t *); ++extern uint16_t qla2x00_set_flash_image(scsi_qla_host_t *, uint8_t *); ++ ++/* ++ * Global Function Prototypes in qla_vendor.c source file. ++ */ ++void qla2x00_set_vend_direction(scsi_qla_host_t *, Scsi_Cmnd *, cmd_entry_t *); ++ ++/* ++ * Global Function Prototypes in qla_dbg.c source file. ++ */ ++extern void qla2x00_dump_isp(scsi_qla_host_t *, int); ++extern void qla2x00_dump_regs(struct Scsi_Host *); ++extern void qla2x00_dump_buffer(uint8_t *, uint32_t); ++extern void qla2x00_print_scsi_cmd(Scsi_Cmnd *); ++extern void qla2x00_print_q_info(struct os_lun *); ++ ++#endif /* _QLA_GBL_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_inioct.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,495 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "inioct.h" ++ ++extern int qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req, ++ uint16_t *ret_mb); ++ ++int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t); ++int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++int ++qla2x00_read_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ uint8_t *usr_temp, *kernel_tmp; ++ uint16_t data; ++ uint32_t i, cnt; ++ uint32_t transfer_size; ++ ++ DEBUG9(printk("qla2x00_read_nvram: entered.\n");) ++ ++ if (pext->ResponseLen < sizeof(nvram_t)) ++ transfer_size = pext->ResponseLen / 2; ++ else ++ transfer_size = sizeof(nvram_t) / 2; ++ ++ /* Dump NVRAM. */ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ for (i = 0, cnt = 0; cnt < transfer_size; cnt++, i++) { ++ data = cpu_to_le16(qla2x00_get_nvram_word(ha, cnt)); ++ ++ kernel_tmp = (uint8_t *)&data; ++ ++ __put_user(*kernel_tmp, usr_temp); ++ ++ /* next byte */ ++ usr_temp++; ++ kernel_tmp++; ++ ++ __put_user(*kernel_tmp, usr_temp); ++ ++ usr_temp++; ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("qla2x00_read_nvram: exiting.\n");) ++ ++ return 0; ++} ++ ++/* ++ * qla2x00_update_nvram ++ * Write data to NVRAM. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * pext = pointer to driver internal IOCTL structure. ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_update_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ uint8_t i, cnt; ++ uint8_t *usr_tmp, *kernel_tmp; ++ nvram_t *pnew_nv; ++ uint16_t *wptr; ++ uint16_t data; ++ uint32_t transfer_size; ++ uint8_t chksum = 0; ++ int ret = 0; ++ ++ // FIXME: Endianess? ++ DEBUG9(printk("qla2x00_update_nvram: entered.\n");) ++ ++ if (pext->RequestLen < sizeof(nvram_t)) ++ transfer_size = pext->RequestLen; ++ else ++ transfer_size = sizeof(nvram_t); ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pnew_nv, ++ sizeof(nvram_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(nvram_t));) ++ return (ret); ++ } ++ ++ /* Read from user buffer */ ++ kernel_tmp = (uint8_t *)pnew_nv; ++ usr_tmp = (uint8_t *)pext->RequestAdr; ++ ++ ret = verify_area(VERIFY_READ, (void *)usr_tmp, transfer_size); ++ if (ret) { ++ DEBUG9_10(printk( ++ "qla2x00_update_nvram: ERROR in buffer verify READ. " ++ "RequestAdr=%p\n", pext->RequestAdr);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return ret; ++ } ++ ++ copy_from_user(kernel_tmp, usr_tmp, transfer_size); ++ ++ kernel_tmp = (uint8_t *)pnew_nv; ++ ++ /* we need to checksum the nvram */ ++ for (i = 0; i < sizeof(nvram_t) - 1; i++) { ++ chksum += *kernel_tmp; ++ kernel_tmp++; ++ } ++ ++ chksum = ~chksum + 1; ++ ++ *kernel_tmp = chksum; ++ ++ /* Write to NVRAM */ ++ wptr = (uint16_t *)pnew_nv; ++ for (cnt = 0; cnt < transfer_size / 2; cnt++) { ++ data = *wptr++; ++ qla2x00_write_nvram_word(ha, cnt, data); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("qla2x00_update_nvram: exiting.\n");) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return 0; ++} ++ ++int ++qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint8_t addr, uint16_t data) ++{ ++ int count; ++ uint16_t word; ++ uint32_t nv_cmd; ++ device_reg_t *reg = ha->iobase; ++ ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ qla2x00_nv_write(ha, 0); ++ qla2x00_nv_write(ha, 0); ++ ++ for (word = 0; word < 8; word++) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Erase Location */ ++ nv_cmd = (addr << 16) | NV_ERASE_OP; ++ nv_cmd <<= 5; ++ for (count = 0; count < 11; count++) { ++ if (nv_cmd & BIT_31) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ else ++ qla2x00_nv_write(ha, 0); ++ ++ nv_cmd <<= 1; ++ } ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Wait for Erase to Finish */ ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ do { ++ NVRAM_DELAY(); ++ word = RD_REG_WORD(®->nvram); ++ } while ((word & NVR_DATA_IN) == 0); ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Write data */ ++ nv_cmd = (addr << 16) | NV_WRITE_OP; ++ nv_cmd |= data; ++ nv_cmd <<= 5; ++ for (count = 0; count < 27; count++) { ++ if (nv_cmd & BIT_31) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ else ++ qla2x00_nv_write(ha, 0); ++ ++ nv_cmd <<= 1; ++ } ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Wait for NVRAM to become ready */ ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ do { ++ NVRAM_DELAY(); ++ word = RD_REG_WORD(®->nvram); ++ } while ((word & NVR_DATA_IN) == 0); ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Disable writes */ ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ for (count = 0; count < 10; count++) ++ qla2x00_nv_write(ha, 0); ++ ++ qla2x00_nv_deselect(ha); ++ ++ DEBUG9(printk("qla2x00_write_nvram_word: exiting.\n");) ++ ++ return 0; ++} ++ ++int ++qla2x00_send_loopback(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int status; ++ uint16_t ret_mb[MAILBOX_REGISTER_COUNT]; ++ INT_LOOPBACK_REQ req; ++ INT_LOOPBACK_RSP rsp; ++ ++ DEBUG9(printk("qla2x00_send_loopback: entered.\n");) ++ ++ ++ if (pext->RequestLen != sizeof(INT_LOOPBACK_REQ)) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk( ++ "qla2x00_send_loopback: invalid RequestLen =%d.\n", ++ pext->RequestLen);) ++ return pext->Status; ++ } ++ ++ if (pext->ResponseLen != sizeof(INT_LOOPBACK_RSP)) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk( ++ "qla2x00_send_loopback: invalid ResponseLen =%d.\n", ++ pext->ResponseLen);) ++ return pext->Status; ++ } ++ ++ status = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " ++ "request buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_from_user((uint8_t *)&req, (uint8_t *)pext->RequestAdr, ++ pext->RequestLen); ++ ++ status = verify_area(VERIFY_READ, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " ++ "response buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_from_user((uint8_t *)&rsp, (uint8_t *)pext->ResponseAdr, ++ pext->ResponseLen); ++ ++ if (req.TransferCount > req.BufferLength || ++ req.TransferCount > rsp.BufferLength) { ++ ++ /* Buffer lengths not large enough. */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ DEBUG9_10(printk( ++ "qla2x00_send_loopback: invalid TransferCount =%d. " ++ "req BufferLength =%d rspBufferLength =%d.\n", ++ req.TransferCount, req.BufferLength, rsp.BufferLength);) ++ ++ return pext->Status; ++ } ++ ++ status = verify_area(VERIFY_READ, (void *)req.BufferAddress, ++ req.TransferCount); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " ++ "user loopback data buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_from_user((uint8_t *)ha->ioctl_mem, (uint8_t *)req.BufferAddress, ++ req.TransferCount); ++ ++ DEBUG9(printk("qla2x00_send_loopback: req -- bufadr=%p, buflen=%x, " ++ "xfrcnt=%x, rsp -- bufadr=%p, buflen=%x.\n", ++ req.BufferAddress, req.BufferLength, req.TransferCount, ++ rsp.BufferAddress, rsp.BufferLength);) ++ ++ /* ++ * AV - the caller of this IOCTL expects the FW to handle ++ * a loopdown situation and return a good status for the ++ * call function and a LOOPDOWN status for the test operations ++ */ ++ /*if (ha->loop_state != LOOP_READY || */ ++ if ( ++ (test_bit(CFG_ACTIVE, &ha->cfg_flags)) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("qla2x00_send_loopback(%ld): " ++ "loop not ready.\n", ha->host_no);) ++ return pext->Status; ++ } ++ ++ status = qla2x00_loopback_test(ha, &req, ret_mb); ++ ++ if (status) { ++ if (status == QL_STATUS_TIMEOUT ) { ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR " ++ "command timed out.\n");) ++ return pext->Status; ++ } else { ++ /* EMPTY. Just proceed to copy back mailbox reg ++ * values for users to interpret. ++ */ ++ DEBUG10(printk("qla2x00_send_loopback: ERROR " ++ "loopback command failed 0x%x.\n", ret_mb[0]);) ++ } ++ } ++ ++ status = verify_area(VERIFY_WRITE, (void *)rsp.BufferAddress, ++ req.TransferCount); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify " ++ "write of return data buffer.\n");) ++ return pext->Status; ++ } ++ ++ DEBUG9(printk("qla2x00_send_loopback: loopback mbx cmd ok. " ++ "copying data.\n");) ++ ++ /* put loopback return data in user buffer */ ++ copy_to_user((uint8_t *)rsp.BufferAddress, ++ (uint8_t *)ha->ioctl_mem, req.TransferCount); ++ ++ rsp.CompletionStatus = ret_mb[0]; ++ if (rsp.CompletionStatus == INT_DEF_LB_COMPLETE) { ++ rsp.CrcErrorCount = ret_mb[1]; ++ rsp.DisparityErrorCount = ret_mb[2]; ++ rsp.FrameLengthErrorCount = ret_mb[3]; ++ rsp.IterationCountLastError = (ret_mb[19] << 16) | ret_mb[18]; ++ } ++ ++ status = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify " ++ "write of response buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_to_user((uint8_t *)pext->ResponseAdr, (uint8_t *)&rsp, ++ pext->ResponseLen); ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("qla2x00_send_loopback: exiting.\n");) ++ ++ return pext->Status; ++} ++ ++int qla2x00_read_option_rom(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ uint8_t *usr_tmp; ++ uint32_t addr; ++ uint32_t midpoint; ++ uint32_t transfer_size; ++ uint8_t data; ++ device_reg_t *reg = ha->iobase; ++ unsigned long cpu_flags; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (pext->ResponseLen != FLASH_IMAGE_SIZE) { ++ pext->Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ return (1); ++ } ++ ++ transfer_size = FLASH_IMAGE_SIZE; ++ ++ midpoint = FLASH_IMAGE_SIZE / 2; ++ usr_tmp = (uint8_t *)pext->ResponseAdr; ++ ++ /* Dump FLASH. */ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ WRT_REG_WORD(®->nvram, 0); ++ for (addr = 0; addr < transfer_size; addr++, usr_tmp++) { ++ if (addr == midpoint) ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ ++ data = qla2x00_read_flash_byte(ha, addr); ++ __put_user(data, usr_tmp); ++ } ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return (0); ++} ++ ++int qla2x00_update_option_rom(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret; ++ uint8_t *usr_tmp; ++ uint8_t *kern_tmp; ++ uint16_t status; ++ unsigned long cpu_flags; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (pext->RequestLen != FLASH_IMAGE_SIZE) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ return (1); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ /* Read from user buffer */ ++ usr_tmp = (uint8_t *)pext->RequestAdr; ++ ret = verify_area(VERIFY_READ, (void *)usr_tmp, FLASH_IMAGE_SIZE); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR in buffer verify READ. " ++ "RequestAdr=%p\n", ++ __func__, pext->RequestAdr);) ++ return (ret); ++ } ++ ++ kern_tmp = (uint8_t *)KMEM_ZALLOC(FLASH_IMAGE_SIZE, 30); ++ if (kern_tmp == NULL) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ printk(KERN_WARNING ++ "%s: ERROR in flash allocation.\n", __func__); ++ return (1); ++ } ++ copy_from_user(kern_tmp, usr_tmp, FLASH_IMAGE_SIZE); ++ ++ /* Go with update */ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ status = qla2x00_set_flash_image(ha, kern_tmp); ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ KMEM_FREE(kern_tmp, FLASH_IMAGE_SIZE); ++ ++ if (status) { ++ ret = 1; ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR updating flash.\n", __func__);) ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return (ret); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_init.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,5945 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ */ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++/* ++* QLogic ISP2x00 Hardware Support Function Prototypes. ++*/ ++uint8_t qla2x00_initialize_adapter(scsi_qla_host_t *); ++ ++static uint8_t qla2x00_isp_firmware(scsi_qla_host_t *); ++static void qla2x00_reset_chip(scsi_qla_host_t *); ++static uint8_t qla2x00_pci_config(scsi_qla_host_t *); ++static uint8_t qla2x00_set_cache_line(scsi_qla_host_t *); ++static uint8_t qla2x00_chip_diag(scsi_qla_host_t *); ++static uint8_t qla2x00_setup_chip(scsi_qla_host_t *ha); ++static uint8_t qla2x00_init_rings(scsi_qla_host_t *ha); ++static uint8_t qla2x00_fw_ready(scsi_qla_host_t *ha); ++static uint8_t qla2x00_nvram_config(scsi_qla_host_t *); ++ ++static void qla2x00_init_fc_db(scsi_qla_host_t *); ++static void qla2x00_init_tgt_map(scsi_qla_host_t *); ++ ++static uint8_t qla2x00_configure_loop(scsi_qla_host_t *); ++static uint8_t qla2x00_configure_local_loop(scsi_qla_host_t *, uint8_t ); ++static uint8_t qla2x00_configure_fabric(scsi_qla_host_t *, uint8_t ); ++static uint8_t qla2x00_find_all_fabric_devs(scsi_qla_host_t *, ++ struct new_dev *, uint16_t *, uint8_t *); ++static void qla2x00_device_resync(scsi_qla_host_t *); ++static int qla2x00_ga_nxt(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gid_pt(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gpn_id(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gnn_id(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gft_id(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_rft_id(scsi_qla_host_t *); ++static int qla2x00_rff_id(scsi_qla_host_t *); ++static int qla2x00_rnn_id(scsi_qla_host_t *); ++static int qla2x00_rsnn_nn(scsi_qla_host_t *); ++ ++static int qla2x00_add_initiator_device(scsi_qla_host_t *, fcdev_t *); ++ ++uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *); ++uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_t); ++ ++static uint8_t qla2x00_update_fc_database(scsi_qla_host_t *, ++ fcdev_t *, uint8_t); ++static int qla2x00_build_fcport_list(scsi_qla_host_t *ha); ++static void qla2x00_config_os(scsi_qla_host_t *ha); ++static uint16_t qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport); ++static int qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int); ++static int qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int); ++static int qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport); ++static void qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun); ++ ++static void qla2x00_lun_free(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++static void qla2x00_get_lun_mask_from_config(scsi_qla_host_t *, ++ fc_port_t *, uint16_t, uint16_t); ++static int qla2x00_bstr_to_hex(char *, uint8_t *, int); ++ ++static uint8_t qla2x00_find_propname(scsi_qla_host_t *, ++ char *, char *, char *, int); ++static int qla2x00_get_prop_16chars(scsi_qla_host_t *, ++ char *, char *, char *); ++static void qla2x00_get_properties(scsi_qla_host_t *, char *); ++ ++static void qla2x00_cfg_persistent_binding(scsi_qla_host_t *); ++ ++static int qla2x00_restart_isp(scsi_qla_host_t *); ++static void qla2x00_reset_adapter(scsi_qla_host_t *); ++ ++#define MAX_LOCAL_LOOP_IDS 127 ++static uint8_t alpa_table[MAX_LOCAL_LOOP_IDS] = { ++ 0xEF, 0xE8, 0xE4, 0xE2, 0xE1, 0xE0, 0xDC, 0xDA, ++ 0xD9, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xCE, ++ 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC7, 0xC6, 0xC5, ++ 0xC3, 0xBC, 0xBA, 0xB9, 0xB6, 0xB5, 0xB4, 0xB3, ++ 0xB2, 0xB1, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9, ++ 0xA7, 0xA6, 0xA5, 0xA3, 0x9F, 0x9E, 0x9D, 0x9B, ++ 0x98, 0x97, 0x90, 0x8F, 0x88, 0x84, 0x82, 0x81, ++ 0x80, 0x7C, 0x7A, 0x79, 0x76, 0x75, 0x74, 0x73, ++ 0x72, 0x71, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, ++ 0x67, 0x66, 0x65, 0x63, 0x5C, 0x5A, 0x59, 0x56, ++ 0x55, 0x54, 0x53, 0x52, 0x51, 0x4E, 0x4D, 0x4C, ++ 0x4B, 0x4A, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3C, ++ 0x3A, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, ++ 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x27, 0x26, ++ 0x25, 0x23, 0x1F, 0x1E, 0x1D, 0x1B, 0x18, 0x17, ++ 0x10, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x00 ++}; ++ ++/****************************************************************************/ ++/* QLogic ISP2x00 Hardware Support Functions. */ ++/****************************************************************************/ ++ ++/* ++* qla2x00_initialize_adapter ++* Initialize board. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++uint8_t ++qla2x00_initialize_adapter(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ uint8_t isp_init = 0; ++ uint8_t restart_risc = 0; ++ uint8_t retry; ++ unsigned long wait_device = 0; ++ ++ ENTER(__func__); ++ ++ /* Clear adapter flags. */ ++ ha->forceLip = 0; ++ ha->flags.online = FALSE; ++ ha->flags.disable_host_adapter = FALSE; ++ ha->flags.reset_active = FALSE; ++ ha->flags.watchdog_enabled = FALSE; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ ha->loop_state = LOOP_DOWN; ++ ha->device_flags = 0; ++ ha->sns_retry_cnt = 0; ++ ha->device_flags = 0; ++ ha->dpc_flags = 0; ++ ha->sns_retry_cnt = 0; ++ ha->failback_delay = 0; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt = 0; ++ ha->iocb_overflow_cnt = 0; ++#endif ++ ha->flags.management_server_logged_in = 0; ++ ha->marker_needed = 0; ++ ha->mbx_flags = 0; ++ ha->isp_abort_cnt = 0; ++ ++ if (!(status = qla2x00_pci_config(ha))) { ++ ++ qla2x00_reset_chip(ha); ++ ++ /* Initialize Fibre Channel database. */ ++ qla2x00_init_fc_db(ha); ++ ++ /* Initialize target map database. */ ++ qla2x00_init_tgt_map(ha); ++ ++ /* Get Flash Version */ ++ qla2x00_get_flash_version(ha); ++ ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Configure NVRAM parameters...\n", ++ ha->host_no); ++ ++ qla2x00_nvram_config(ha); ++ ++ ha->retry_count = ql2xretrycount; ++ ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Verifying loaded RISC code...\n", ++ ha->host_no); ++ ++ qla2x00_set_cache_line(ha); ++ ++ /* ++ * If the user specified a device configuration on the command ++ * line then use it as the configuration. Otherwise, we scan ++ * for all devices. ++ */ ++ if (ql2xdevconf) { ++ ha->cmdline = ql2xdevconf; ++ if (!ha->flags.failover_enabled) ++ qla2x00_get_properties(ha, ql2xdevconf); ++ } ++ ++ retry = 10; ++ /* ++ * Try an configure the loop. ++ */ ++ do { ++ restart_risc = 0; ++ isp_init = 0; ++ ++ /* If firmware needs to be loaded */ ++ if (qla2x00_isp_firmware(ha)) { ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Verifying chip...\n", ++ ha->host_no); ++ ++ if (!(status = qla2x00_chip_diag(ha))) ++ status = qla2x00_setup_chip(ha); ++ ++ if (!status) { ++ DEBUG(printk("scsi(%ld): Chip verified " ++ "and RISC loaded...\n", ++ ha->host_no)); ++ } ++ } ++ ++ /* Retrieve firmware information */ ++ qla2x00_get_fw_version(ha, &ha->fw_major_version, ++ &ha->fw_minor_version, &ha->fw_subminor_version, ++ &ha->fw_attributes); ++ ++ if (!status && !(status = qla2x00_init_rings(ha))) { ++ /* dg - 7/3/1999 ++ * ++ * Wait for a successful LIP up to a maximum ++ * of (in seconds): RISC login timeout value, ++ * RISC retry count value, and port down retry ++ * value OR a minimum of 4 seconds OR If no ++ * cable, only 5 seconds. ++ */ ++ DEBUG(printk("scsi(%ld): Init rings OK..." ++ "calling qla2x00_fw_ready()...\n", ++ ha->host_no)); ++ ++ if (!qla2x00_fw_ready(ha)) { ++ clear_bit(RESET_MARKER_NEEDED, ++ &ha->dpc_flags); ++ clear_bit(COMMAND_WAIT_NEEDED, ++ &ha->dpc_flags); ++ ++ /* ++ * Go setup flash database devices ++ * with proper Loop ID's. ++ */ ++ do { ++ clear_bit(LOOP_RESYNC_NEEDED, ++ &ha->dpc_flags); ++ status = qla2x00_configure_loop(ha); ++ ++ /* ++ * Temp code: delay a while for certain ++ * slower devices to become ready. ++ */ ++ for ((wait_device = jiffies + HZ); ++ !time_after_eq(jiffies,wait_device);) { ++ qla2x00_check_fabric_devices(ha); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5); ++ } ++ ++ } while (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) && ++ (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) ); ++ } ++ ++ if (ha->flags.update_config_needed) { ++ ha->init_cb->add_firmware_options[0] |= ++ ((ha->operating_mode << 4) & ++ (BIT_6 | BIT_5 | BIT_4)); ++ ++ restart_risc = 1; ++ } ++ ++ if (ha->mem_err) { ++ restart_risc = 1; ++ } ++ isp_init = 1; ++ ++ } ++ } while (restart_risc && retry--); ++ ++ if (isp_init) { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ha->marker_needed = 1; ++ qla2x00_marker(ha, 0, 0, MK_SYNC_ALL); ++ ha->marker_needed = 0; ++ ++ ha->flags.online = TRUE; ++ } ++ ++ } ++ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) ++ if (status) ++ printk("%s(): **** FAILED ****\n", __func__); ++#endif ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_isp_firmware() - Choose firmware image. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_isp_firmware(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ ++ ++ ENTER(__func__); ++ ++ /* Assume loading risc code */ ++ status = 1; ++ ++ if (ha->flags.disable_risc_code_load) { ++ DEBUG2(printk("scsi(%ld): RISC CODE NOT loaded\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): RISC CODE NOT loaded\n", ha->host_no); ++ ++ /* Verify checksum of loaded RISC code. */ ++ status = qla2x00_verify_checksum(ha); ++ } ++ ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): **** Load RISC code ****\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_reset_chip() - Reset ISP chip. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static void ++qla2x00_reset_chip(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg = ha->iobase; ++ uint32_t cnt; ++ unsigned long mbx_flags = 0; ++ uint16_t cmd; ++ ++ ENTER(__func__); ++ ++ /* Disable ISP interrupts. */ ++ qla2x00_disable_intrs(ha); ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Turn off master enable */ ++ cmd = 0; ++ pci_read_config_word(ha->pdev, PCI_COMMAND, &cmd); ++ cmd &= ~PCI_COMMAND_MASTER; ++ pci_write_config_word(ha->pdev, PCI_COMMAND, cmd); ++ ++#if defined(ISP2200) || defined(ISP2300) ++ /* Pause RISC. */ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) ++ break; ++ udelay(100); ++ } ++ } else { ++ udelay(10); ++ } ++ ++ /* Select FPM registers. */ ++ WRT_REG_WORD(®->ctrl_status, 0x20); ++ ++ /* FPM Soft Reset. */ ++ WRT_REG_WORD(®->fpm_diag_config, 0x100); ++ ++#if defined(ISP2300) ++ /* Toggle Fpm Reset. */ ++ WRT_REG_WORD(®->fpm_diag_config, 0x0); ++#endif ++ ++ /* Select frame buffer registers. */ ++ WRT_REG_WORD(®->ctrl_status, 0x10); ++ ++ /* Reset frame buffer FIFOs. */ ++#if defined(ISP2200) ++ WRT_REG_WORD(®->fb_cmd, 0xa000); ++#else ++ WRT_REG_WORD(®->fb_cmd, 0x00fc); ++ ++ /* Read back fb_cmd until zero or 3 seconds max */ ++ for (cnt = 0; cnt < 3000; cnt++) { ++ if ((RD_REG_WORD(®->fb_cmd) & 0xff) == 0) ++ break; ++ udelay(100); ++ } ++#endif /* defined(ISP2200) */ ++ ++ /* Select RISC module registers. */ ++ WRT_REG_WORD(®->ctrl_status, 0); ++ ++ /* Reset RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ ++ /* Release RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ ++#endif /* defined(ISP2200) || defined(ISP2300) */ ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_HOST_INT); ++ ++ /* Reset ISP chip. */ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ /* Wait for RISC to recover from reset. */ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ udelay(10); ++ } else { ++ for (cnt = 30000; cnt; cnt--) { ++ if ((RD_REG_WORD(®->ctrl_status) & ++ CSR_ISP_SOFT_RESET) == 0) ++ break; ++ udelay(100); ++ } ++ } ++ ++ /* Reset RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ ++ WRT_REG_WORD(®->semaphore, 0); ++ ++ /* Release RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ udelay(100); ++ } else { ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) ++ QLA_MBX_REG_LOCK(ha); ++ ++ if (RD_REG_WORD(®->mailbox0) != MBS_BUSY) { ++ if (!(test_bit(ABORT_ISP_ACTIVE, ++ &ha->dpc_flags))) ++ QLA_MBX_REG_UNLOCK(ha); ++ break; ++ } ++ ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ udelay(100); ++ } ++ } ++ ++ /* Turn on master enable */ ++ cmd |= PCI_COMMAND_MASTER; ++ pci_write_config_word(ha->pdev, PCI_COMMAND, cmd); ++ ++#if defined(ISP2200) || defined(ISP2300) ++ /* Disable RISC pause on FPM parity error. */ ++ WRT_REG_WORD(®->hccr, HCCR_DISABLE_PARITY_PAUSE); ++#endif ++ ++ /* Save PCI information. */ ++ ha->isp_ctrl_status = RD_REG_WORD(®->ctrl_status); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_pci_config() - Setup device PCI configuration registers. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_pci_config(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ uint16_t w; ++#if defined(ISP2300) ++ uint32_t cnt; ++ unsigned long flags = 0; ++#endif ++#if MEMORY_MAPPED_IO ++ uint32_t mmapbase; ++ uint32_t page_offset, base; ++#endif ++ ++ ENTER(__func__); ++ ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Configuring PCI space...\n", ++ ha->host_no); ++ ++ /* ++ * Turn on PCI master; for system BIOSes that don't turn it on by ++ * default. ++ */ ++ pci_set_master(ha->pdev); ++ pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision); ++ ++ if (ha->iobase) ++ return 0; ++ ++ /* ++ * We want to respect framework's setting of PCI configuration space ++ * command register and also want to make sure that all bits of ++ * interest to us are properly set in command register. ++ */ ++ pci_read_config_word(ha->pdev, PCI_COMMAND, &w); ++ w |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | ++ PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY | PCI_COMMAND_SERR); ++ ++#if MEMORY_MAPPED_IO ++ DEBUG(printk("scsi(%ld): I/O SPACE and MEMORY MAPPED I/O enabled.\n", ++ ha->host_no)); ++#else ++ DEBUG(printk("scsi(%ld): I/O SPACE enabled and MEMORY MAPPED I/O " ++ "disabled.\n", ha->host_no)); ++ ++ w &= ~PCI_COMMAND_MEMORY; ++#endif ++ ++#if defined(ISP2300) ++ /* PCI Specification Revision 2.3 changes */ ++ if (ha->pdev->device == QLA2322_DEVICE_ID) { ++ /* Command Register -- Reset Interrupt Disable -- BIT_10 */ ++ w &= ~BIT_10; ++ } ++ ++ /* ++ * If this is a 2300 card and not 2312, reset the COMMAND_INVALIDATE ++ * due to a bug in the 2300. Unfortunately, the 2310 also reports ++ * itself as a 2300 so we need to get the fb revision level -- a 6 ++ * indicates it really is a 2300 and not a 2310. ++ */ ++ if (ha->pdev->device == QLA2300_DEVICE_ID) { ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Pause RISC. */ ++ WRT_REG_WORD(&ha->iobase->hccr, HCCR_PAUSE_RISC); ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if ((RD_REG_WORD(&ha->iobase->hccr) & ++ HCCR_RISC_PAUSE) != 0) ++ break; ++ ++ udelay(10); ++ } ++ ++ /* Select FPM registers. */ ++ WRT_REG_WORD(&ha->iobase->ctrl_status, 0x20); ++ ++ /* Get the fb rev level */ ++ if (RD_REG_WORD(&ha->iobase->fb_cmd) == FPM_2300) ++ w &= ~PCI_COMMAND_INVALIDATE; ++ ++ /* Deselect FPM registers. */ ++ WRT_REG_WORD(&ha->iobase->ctrl_status, 0x0); ++ ++ /* Release RISC module. */ ++ WRT_REG_WORD(&ha->iobase->hccr, HCCR_RELEASE_RISC); ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if ((RD_REG_WORD(&ha->iobase->hccr) & ++ HCCR_RISC_PAUSE) == 0) ++ break; ++ ++ udelay(10); ++ } ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ } ++#endif ++ ++ pci_write_config_word(ha->pdev, PCI_COMMAND, w); ++ ++ /* Reset expansion ROM address decode enable */ ++ pci_read_config_word(ha->pdev, PCI_ROM_ADDRESS, &w); ++ w &= ~PCI_ROM_ADDRESS_ENABLE; ++ pci_write_config_word(ha->pdev, PCI_ROM_ADDRESS, w); ++ ++ status = 0; ++#if MEMORY_MAPPED_IO ++ /* Get memory mapped I/O address */ ++ pci_read_config_dword(ha->pdev, PCI_BASE_ADDRESS_1, &mmapbase); ++ mmapbase &= PCI_BASE_ADDRESS_MEM_MASK; ++ ++ /* Find proper memory chunk for memory map I/O reg */ ++ base = mmapbase & PAGE_MASK; ++ page_offset = mmapbase - base; ++ ++ /* Get virtual address for I/O registers */ ++ ha->mmpbase = ioremap(base, page_offset + 256); ++ if (ha->mmpbase) { ++ ha->mmpbase += page_offset; ++ ha->iobase = ha->mmpbase; ++ status = 0; ++ } ++#endif ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_set_cache_line() - Sets PCI cache line parameter. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_set_cache_line(struct scsi_qla_host * ha) ++{ ++ unsigned char cache_size; ++ ++ ENTER(__func__); ++ ++ /* Set the cache line. */ ++ if (!ha->flags.set_cache_line_size_1) { ++ LEAVE(__func__); ++ ++ return (0); ++ } ++ ++ /* Taken from drivers/net/acenic.c */ ++ pci_read_config_byte(ha->pdev, PCI_CACHE_LINE_SIZE, &cache_size); ++ cache_size <<= 2; ++ if (cache_size != SMP_CACHE_BYTES) { ++ printk(KERN_INFO ++ "scsi(%ld): PCI cache line size set incorrectly " ++ "(%d bytes) by BIOS/FW, ", ++ ha->host_no, cache_size); ++ ++ if (cache_size > SMP_CACHE_BYTES) { ++ printk(KERN_INFO "expecting %d.\n", SMP_CACHE_BYTES); ++ } else { ++ printk(KERN_INFO ++ "correcting to %d.\n", SMP_CACHE_BYTES); ++ pci_write_config_byte(ha->pdev, ++ PCI_CACHE_LINE_SIZE, SMP_CACHE_BYTES >> 2); ++ } ++ } ++ ++ LEAVE(__func__); ++ ++ return (0); ++} ++ ++/** ++ * qla2x00_chip_diag() - Test chip for proper operation. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_chip_diag(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ device_reg_t *reg = ha->iobase; ++ unsigned long flags = 0; ++ uint16_t data; ++ uint32_t cnt; ++ uint16_t mb[5]; ++ ++ ENTER(__func__); ++ ++ /* Assume a failed state */ ++ status = 1; ++ ++ DEBUG3(printk("scsi(%ld): Testing device at %lx.\n", ++ ha->host_no, (u_long)®->flash_address)); ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Reset ISP chip. */ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ data = qla2x00_debounce_register(®->ctrl_status); ++ for (cnt = 6000000 ; cnt && (data & CSR_ISP_SOFT_RESET); cnt--) { ++ udelay(5); ++ data = RD_REG_WORD(®->ctrl_status); ++ barrier(); ++ } ++ ++ if (!cnt) ++ goto chip_diag_failed; ++ ++ DEBUG3(printk("scsi(%ld): Reset register cleared by chip reset\n", ++ ha->host_no)); ++ ++ /* Reset RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ ++#if defined(ISP2300) ++ /* Workaround for QLA2312 PCI parity error */ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ udelay(10); ++ } else { ++ data = qla2x00_debounce_register(®->mailbox0); ++ for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) { ++ udelay(5); ++ data = RD_REG_WORD(®->mailbox0); ++ barrier(); ++ } ++ } ++#else ++ data = qla2x00_debounce_register(®->mailbox0); ++ for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) { ++ udelay(5); ++ data = RD_REG_WORD(®->mailbox0); ++ barrier(); ++ } ++#endif ++ if (!cnt) ++ goto chip_diag_failed; ++ ++ /* Check product ID of chip */ ++ DEBUG3(printk("scsi(%ld): Checking product ID of chip\n", ++ ha->host_no)); ++ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ mb[3] = RD_REG_WORD(®->mailbox3); ++ mb[4] = qla2x00_debounce_register(®->mailbox4); ++ ++ if (mb[1] != PROD_ID_1 || ++ (mb[2] != PROD_ID_2 && mb[2] != PROD_ID_2a) || ++ mb[3] != PROD_ID_3 || ++ (mb[4] != PROD_ID_4 && mb[4] != PROD_ID_4a)) { ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Wrong product ID = 0x%x,0x%x,0x%x,0x%x\n", ++ ha->host_no, mb[1], mb[2], mb[3], mb[4]); ++ ++ goto chip_diag_failed; ++ } ++ ++ /* Adjust fw RISC transfer size */ ++ ha->fw_transfer_size = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT; ++#if defined(ISP2200) ++ if (ha->pdev->device == QLA2200_DEVICE_ID && ++ RD_REG_WORD(®->mailbox7) == QLA2200A_RISC_ROM_VER) { ++ ++ /* Limit firmware transfer size with a 2200A */ ++ DEBUG3(printk("scsi(%ld): Found QLA2200A chip.\n", ++ ha->host_no)); ++ ++ ha->fw_transfer_size = 128; ++ } ++#endif ++ ++ /* Wrap Incoming Mailboxes Test. */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ DEBUG3(printk("scsi(%ld): Checking mailboxes.\n", ha->host_no)); ++ status = qla2x00_mbx_reg_test(ha); ++ if (status) { ++ DEBUG(printk("scsi(%ld): Failed mailbox send register test\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Failed mailbox send register test\n", ++ ha->host_no); ++ } ++ else { ++ /* Flag a successful status */ ++ status = 0; ++ } ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++chip_diag_failed: ++ if (status) ++ DEBUG2_3(printk("scsi(%ld): Chip diagnostics **** FAILED " ++ "****\n", ha->host_no)); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_setup_chip() - Load and start RISC firmware. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_setup_chip(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++ uint16_t cnt; ++ uint16_t *risc_code; ++ unsigned long risc_address; ++ unsigned long risc_code_size; ++ int num; ++ int i; ++ uint16_t *req_ring; ++ struct qla_fw_info *fw_iter; ++ ++ ENTER(__func__); ++ ++ /* Load firmware sequences */ ++ fw_iter = ha->brd_info->fwinfo; ++ while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) { ++ risc_code = fw_iter->fwcode; ++ risc_code_size = *fw_iter->fwlen; ++ ++ if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { ++ risc_address = *fw_iter->fwstart; ++ } else { ++ /* Extended address */ ++ risc_address = *fw_iter->lfwstart; ++ } ++ ++ num = 0; ++ status = 0; ++ while (risc_code_size > 0 && !status) { ++ cnt = (uint16_t)(ha->fw_transfer_size >> 1); ++ if (cnt > risc_code_size) ++ cnt = risc_code_size; ++ ++ DEBUG7(printk("scsi(%ld): Loading risc segment@ " ++ "addr %p, number of bytes 0x%x, offset 0x%lx.\n", ++ ha->host_no, risc_code, cnt, risc_address)); ++ ++ req_ring = (uint16_t *)ha->request_ring; ++ for (i = 0; i < cnt; i++) ++ req_ring[i] = cpu_to_le16(risc_code[i]); ++ ++ /* ++ * Flush written firmware to the ha->request_ring buffer ++ * before DMA. ++ */ ++ flush_cache_all(); ++ ++ if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { ++ status = qla2x00_load_ram(ha, ++ ha->request_dma, risc_address, cnt); ++ } else { ++ status = qla2x00_load_ram_ext(ha, ++ ha->request_dma, risc_address, cnt); ++ } ++ if (status) { ++ DEBUG(printk("scsi(%ld): [ERROR] Failed to " ++ "load segment %d of firmware\n", ++ ha->host_no, num)); ++ printk(KERN_WARNING ++ "scsi(%ld): [ERROR] Failed to load " ++ "segment %d of firmware\n", ++ ha->host_no, num); ++ ++ qla2x00_dump_regs(ha->host); ++ break; ++ } ++ ++ risc_code += cnt; ++ risc_address += cnt; ++ risc_code_size -= cnt; ++ num++; ++ } ++ ++ /* Next firmware sequence */ ++ fw_iter++; ++ } ++ ++ /* Verify checksum of loaded RISC code. */ ++ if (!status) { ++ DEBUG(printk("scsi(%ld): Verifying Checksum of loaded RISC " ++ "code.\n", ha->host_no)); ++ ++ status = qla2x00_verify_checksum(ha); ++ if (status == QL_STATUS_SUCCESS) { ++ /* Start firmware execution. */ ++ DEBUG(printk("scsi(%ld): Checksum OK, start " ++ "firmware.\n", ha->host_no)); ++ ++ status = qla2x00_execute_fw(ha); ++ } ++ else { ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): ISP Firmware failed checksum.\n", ++ ha->host_no)); ++ } ++ } ++ ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): Setup chip **** FAILED ****.\n", ++ ha->host_no)); ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_init_rings() - Initializes firmware. ++ * @ha: HA context ++ * ++ * Beginning of request ring has initialization control block already built ++ * by nvram config routine. ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_init_rings(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ uint8_t status; ++ int cnt; ++ device_reg_t *reg = ha->iobase; ++ ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Clear outstanding commands array. */ ++ for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) ++ ha->outstanding_cmds[cnt] = 0; ++ ++ ha->current_outstanding_cmd = 0; ++ ++ /* Clear RSCN queue. */ ++ ha->rscn_in_ptr = 0; ++ ha->rscn_out_ptr = 0; ++ ++ /* Initialize firmware. */ ++ ha->request_ring_ptr = ha->request_ring; ++ ha->req_ring_index = 0; ++ ha->req_q_cnt = REQUEST_ENTRY_CNT; ++ ha->response_ring_ptr = ha->response_ring; ++ ha->rsp_ring_index = 0; ++ ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), 0); ++ WRT_REG_WORD(ISP_REQ_Q_OUT(reg), 0); ++ WRT_REG_WORD(ISP_RSP_Q_IN(reg), 0); ++ WRT_REG_WORD(ISP_RSP_Q_OUT(reg), 0); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ DEBUG(printk("scsi(%ld): Issue init firmware.\n", ha->host_no)); ++ status = qla2x00_init_firmware(ha, sizeof(init_cb_t)); ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): Init firmware **** FAILED ****.\n", ++ ha->host_no)); ++ } else { ++ /* Setup seriallink options */ ++ uint16_t swing, emphasis; ++ uint16_t opt10, opt11; ++ ++ DEBUG3(printk("scsi(%ld): Serial link options:\n", ++ ha->host_no)); ++ DEBUG3(qla2x00_dump_buffer( ++ (uint8_t *)&ha->fw_seriallink_options, ++ sizeof(ha->fw_seriallink_options))); ++ ++ qla2x00_get_fw_options(ha, ++ &ha->fw_options1, &ha->fw_options2, &ha->fw_options3); ++ ++ ha->fw_options1 &= ~BIT_8; ++ if (ha->fw_seriallink_options[1] & BIT_2) ++ ha->fw_options1 |= BIT_8; ++ ++ /* 1G settings */ ++ swing = ha->fw_seriallink_options[0] & (BIT_2 | BIT_1 | BIT_0); ++ emphasis = ha->fw_seriallink_options[0] & (BIT_4 | BIT_3); ++ emphasis >>= 3; ++ opt10 = (emphasis << 14) | (swing << 8) | 0x3; ++ ++ /* 2G settings */ ++ swing = ha->fw_seriallink_options[0] & (BIT_7 | BIT_6 | BIT_5); ++ swing >>= 5; ++ emphasis = ha->fw_seriallink_options[1] & (BIT_1 | BIT_0); ++ opt11 = (emphasis << 14) | (swing << 8) | 0x3; ++ ++ qla2x00_set_fw_options(ha, ha->fw_options1, ++ ha->fw_options2, ha->fw_options3, opt10, opt11); ++ ++ DEBUG3(printk("scsi(%ld): Init firmware -- success.\n", ++ ha->host_no)); ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_fw_ready() - Waits for firmware ready. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_fw_ready(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++ unsigned long wtime, mtime; ++ uint16_t min_wait; /* Minimum wait time if loop is down */ ++ uint16_t wait_time; /* Wait time if loop is coming ready */ ++ uint16_t pause_time; ++ uint16_t fw_state; ++ ++ /* 20 seconds for loop down. */ ++ min_wait = 20; ++ ha->device_flags &= ~DFLG_NO_CABLE; ++ ++ /* ++ * Firmware should take at most one RATOV to login, plus 5 seconds for ++ * our own processing. ++ */ ++ if ((wait_time = (ha->retry_count*ha->login_timeout) + 5) < min_wait) { ++ wait_time = min_wait; ++ } ++ ++ pause_time = 1000; /* 1000 usec */ ++ ++ /* Min wait time if loop down */ ++ mtime = jiffies + (min_wait * HZ); ++ ++ /* wait time before firmware ready */ ++ wtime = jiffies + (wait_time * HZ); ++ ++ /* Wait for ISP to finish LIP */ ++ if (!qla2x00_quiet) ++ printk(KERN_INFO ++ "scsi(%ld): Waiting for LIP to complete...\n", ha->host_no); ++ ++ DEBUG3(printk("scsi(%ld): Waiting for LIP to complete...\n", ++ ha->host_no)); ++ ++ do { ++ status = qla2x00_get_firmware_state(ha, &fw_state); ++ ++ if (status == QL_STATUS_SUCCESS) { ++ if (fw_state == FSTATE_READY) { ++ DEBUG(printk("scsi(%ld): F/W Ready - OK \n", ++ ha->host_no)); ++ ++ qla2x00_get_retry_cnt(ha, ++ &ha->retry_count, &ha->login_timeout); ++ ++ status = QL_STATUS_SUCCESS; ++ break; ++ } ++ ++ status = QL_STATUS_ERROR; ++ ++ if (atomic_read(&ha->loop_down_timer) || ++ fw_state == FSTATE_LOSS_OF_SYNC) { ++ ++ /* Loop down. Timeout on min_wait */ ++ if (time_after_eq(jiffies, mtime)) { ++ printk(KERN_INFO ++ "scsi(%ld): Cable is " ++ "unplugged...\n", ++ ha->host_no); ++ ++ ha->device_flags |= DFLG_NO_CABLE; ++ break; ++ } ++ } ++ } else { ++ /* Mailbox cmd failed. Timeout on min_wait. */ ++ if (time_after_eq(jiffies, mtime)) ++ break; ++ } ++ ++ if (time_after_eq(jiffies, wtime)) ++ break; ++ ++ /* Delay for a while */ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ / 2); ++ ++ DEBUG3(printk("scsi(%ld): fw_state=%x curr time=%lx.\n", ++ ha->host_no, fw_state, jiffies)); ++ } while (1); ++ ++ DEBUG(printk("scsi(%ld): fw_state=%x curr time=%lx.\n", ++ ha->host_no, fw_state, jiffies)); ++ ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): Firmware ready **** FAILED ****.\n", ++ ha->host_no)); ++ } ++ ++ return (status); ++} ++ ++/* ++* qla2x00_configure_hba ++* Setup adapter context. ++* ++* Input: ++* ha = adapter state pointer. ++* ++* Returns: ++* 0 = success ++* ++* Context: ++* Kernel context. ++*/ ++static uint8_t ++qla2x00_configure_hba(scsi_qla_host_t *ha) ++{ ++ uint8_t rval; ++ uint16_t loop_id; ++ uint16_t topo; ++ uint8_t al_pa; ++ uint8_t area; ++ uint8_t domain; ++ char connect_type[22]; ++ ++ ENTER(__func__); ++ ++ /* Get host addresses. */ ++ rval = qla2x00_get_adapter_id(ha, ++ &loop_id, &al_pa, &area, &domain, &topo); ++ if (rval != QL_STATUS_SUCCESS) { ++ printk(KERN_WARNING ++ "scsi(%ld): ERROR -- Unable to get host loop ID.\n", ++ ha->host_no); ++ return (rval); ++ } ++ ++ if (topo == 4) { ++ printk(KERN_INFO ++ "scsi(%ld): Cannot get topology - retrying.\n", ++ ha->host_no); ++ return (QL_STATUS_ERROR); ++ } ++ ++ ha->loop_id = loop_id; ++ ++#if defined(ISP2100) ++ /* Make sure 2100 only has loop, in case of any firmware bug. */ ++ topo = 0; ++#endif ++ ++ /* initialize */ ++ ha->min_external_loopid = SNS_FIRST_LOOP_ID; ++ ha->operating_mode = LOOP; ++ ++ switch (topo) { ++ case 0: ++ DEBUG3(printk("scsi(%ld): HBA in NL topology.\n", ++ ha->host_no)); ++ ha->current_topology = ISP_CFG_NL; ++ strcpy(connect_type, "(Loop)"); ++ break; ++ ++ case 1: ++ DEBUG3(printk("scsi(%ld): HBA in FL topology.\n", ++ ha->host_no)); ++ ha->current_topology = ISP_CFG_FL; ++ strcpy(connect_type, "(FL_Port)"); ++ break; ++ ++ case 2: ++ DEBUG3(printk("scsi(%ld): HBA in N P2P topology.\n", ++ ha->host_no)); ++ ha->operating_mode = P2P; ++ ha->current_topology = ISP_CFG_N; ++ strcpy(connect_type, "(N_Port-to-N_Port)"); ++ break; ++ ++ case 3: ++ DEBUG3(printk("scsi(%ld): HBA in F P2P topology.\n", ++ ha->host_no)); ++ ha->operating_mode = P2P; ++ ha->current_topology = ISP_CFG_F; ++ strcpy(connect_type, "(F_Port)"); ++ break; ++ ++ default: ++ DEBUG3(printk("scsi(%ld): HBA in unknown topology %x. " ++ "Using NL.\n", ++ ha->host_no, topo)); ++ ha->current_topology = ISP_CFG_NL; ++ strcpy(connect_type, "(Loop)"); ++ break; ++ } ++ ++ /* Save Host port and loop ID. */ ++ /* byte order - Big Endian */ ++ ha->d_id.b.domain = domain; ++ ha->d_id.b.area = area; ++ ha->d_id.b.al_pa = al_pa; ++ ++ if (!qla2x00_quiet) ++ printk(KERN_INFO ++ "scsi(%ld): Topology - %s, Host Loop address 0x%x\n", ++ ha->host_no, connect_type, ha->loop_id); ++ ++ if (rval) { ++ DEBUG2_3(printk("scsi(%ld): FAILED.\n", ha->host_no)); ++ } else { ++ DEBUG3(printk("scsi(%ld): exiting normally.\n", ha->host_no)); ++ } ++ ++ return(rval); ++} ++ ++/* ++* NVRAM configuration for ISP 2xxx ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Output: ++* initialization control block in response_ring ++* host adapters parameters in host adapter block ++* ++* Returns: ++* 0 = success. ++*/ ++static uint8_t ++qla2x00_nvram_config(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++ uint8_t chksum = 0; ++ uint16_t cnt, base; ++ uint8_t *dptr1, *dptr2; ++ init_cb_t *icb = ha->init_cb; ++ nvram_t *nv = (nvram_t *)ha->request_ring; ++ uint16_t *wptr = (uint16_t *)ha->request_ring; ++#if defined(ISP2300) ++ device_reg_t *reg = ha->iobase; ++ uint16_t data; ++#endif ++ ++ if (ha->flags.nvram_config_done) ++ return (status); ++ ++ ENTER(__func__); ++ ++ /* Determine NVRAM starting address. */ ++ base = 0; ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ data = RD_REG_WORD(®->ctrl_status); ++ if ((data >> 14) == 1) ++ base = 0x80; ++ ++ data = RD_REG_WORD(®->nvram); ++ while (data & NVR_BUSY) { ++ udelay(100); ++ data = RD_REG_WORD(®->nvram); ++ } ++ ++ /* Lock resource */ ++ WRT_REG_WORD(®->host_semaphore, 0x1); ++ udelay(5); ++ data = RD_REG_WORD(®->host_semaphore); ++ while ((data & BIT_0) == 0) { ++ /* Lock failed */ ++ udelay(100); ++ WRT_REG_WORD(®->host_semaphore, 0x1); ++ udelay(5); ++ data = RD_REG_WORD(®->host_semaphore); ++ } ++ } ++#endif ++ ++ /* Get NVRAM data and calculate checksum. */ ++ for (cnt = 0; cnt < sizeof(nvram_t)/2; cnt++) { ++ *wptr = cpu_to_le16(qla2x00_get_nvram_word(ha, (cnt+base))); ++ chksum += (uint8_t)*wptr; ++ chksum += (uint8_t)(*wptr >> 8); ++ wptr++; ++ } ++ ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ /* Unlock resource */ ++ WRT_REG_WORD(®->host_semaphore, 0); ++ } ++#endif ++ ++ DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no)); ++ DEBUG5(qla2x00_dump_buffer( ++ (uint8_t *)ha->request_ring, sizeof(nvram_t))); ++ ++ /* Bad NVRAM data, set defaults parameters. */ ++ if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || ++ nv->id[2] != 'P' || nv->id[3] != ' ' || nv->nvram_version < 1) { ++ ++ /* Reset NVRAM data. */ ++ DEBUG(printk("scsi(%ld): Using defaults for NVRAM - " ++ "checksum=0x%x, Id=%c, version=0x%x\n", ++ ha->host_no, ++ chksum, nv->id[0], nv->nvram_version)); ++ ++ memset(nv, 0, sizeof(nvram_t)); ++ ++ /* ++ * Set default initialization control block. ++ */ ++ nv->parameter_block_version = ICB_VERSION; ++ ++#if defined(ISP2300) ++ nv->firmware_options[0] = BIT_2 | BIT_1; ++ nv->firmware_options[1] = BIT_7 | BIT_5; ++ nv->add_firmware_options[0] = BIT_5; ++ nv->add_firmware_options[1] = BIT_5 | BIT_4; ++ nv->frame_payload_size = __constant_cpu_to_le16(2048); ++#elif defined(ISP2200) ++ nv->firmware_options[0] = BIT_3 | BIT_2 | BIT_1; ++ nv->firmware_options[1] = BIT_7 | BIT_5; ++ nv->add_firmware_options[0] = BIT_5 | BIT_4; ++ nv->add_firmware_options[1] = BIT_5 | BIT_4; ++ nv->frame_payload_size = __constant_cpu_to_le16(1024); ++#else /* defined(ISP2100) */ ++ nv->firmware_options[0] = BIT_3 | BIT_1; ++ nv->firmware_options[1] = BIT_5; ++ nv->frame_payload_size = __constant_cpu_to_le16(1024); ++#endif ++ ++ nv->max_iocb_allocation = __constant_cpu_to_le16(256); ++ nv->execution_throttle = __constant_cpu_to_le16(16); ++ nv->retry_count = 8; ++ nv->retry_delay = 1; ++ ++ nv->port_name[0] = 33; ++ nv->port_name[3] = 224; ++ nv->port_name[4] = 139; ++ ++ nv->login_timeout = 4; ++ ++ /* ++ * Set default host adapter parameters ++ */ ++ nv->host_p[1] = BIT_2; ++ nv->reset_delay = 5; ++ nv->port_down_retry_count = 8; ++ nv->max_luns_per_target = __constant_cpu_to_le16(8); ++ ++ status = 1; ++ } ++ ++ /* Reset Initialization control block */ ++ memset(icb, 0, sizeof(init_cb_t)); ++ ++ /* ++ * Setup driver NVRAM options. ++ */ ++ nv->firmware_options[0] |= (BIT_6 | BIT_1); ++ nv->firmware_options[0] &= ~(BIT_5 | BIT_4); ++ nv->firmware_options[1] |= (BIT_5 | BIT_0); ++ nv->firmware_options[1] &= ~BIT_4; ++#if defined(ISP2300) ++ nv->firmware_options[0] |= BIT_2; ++ nv->firmware_options[0] &= ~BIT_3; ++#elif defined(ISP2200) ++ nv->firmware_options[0] |= BIT_2; ++#endif ++ ++#if !defined(FC_IP_SUPPORT) ++ /* Enable FC-Tape support */ ++ nv->firmware_options[1] |= BIT_7; ++ nv->add_firmware_options[1] |= (BIT_5 | BIT_4); ++#endif ++ ++ /* ++ * Copy over NVRAM RISC parameter block to initialization control block. ++ */ ++ dptr1 = (uint8_t *)icb; ++ dptr2 = (uint8_t *)&nv->parameter_block_version; ++ cnt = (uint8_t *)&icb->request_q_outpointer - (uint8_t *)&icb->version; ++ while (cnt--) ++ *dptr1++ = *dptr2++; ++ ++ /* Copy 2nd half. */ ++ dptr1 = (uint8_t *)icb->add_firmware_options; ++ cnt = (uint8_t *)icb->reserved_3 - (uint8_t *)icb->add_firmware_options; ++ while (cnt--) ++ *dptr1++ = *dptr2++; ++ ++ /* Prepare nodename */ ++ if ((icb->firmware_options[1] & BIT_6) == 0) { ++ /* ++ * Firmware will apply the following mask if the nodename was ++ * not provided. ++ */ ++ memcpy(icb->node_name, icb->port_name, WWN_SIZE); ++ icb->node_name[0] &= 0xF0; ++ } ++ ++ /* ++ * Set host adapter parameters. ++ */ ++ ha->nvram_version = nv->nvram_version; ++ ++ ha->flags.disable_luns = ((nv->host_p[0] & BIT_2) ? 1 : 0); ++ ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); ++ ha->flags.set_cache_line_size_1 = ((nv->host_p[0] & BIT_5) ? 1 : 0); ++ ha->flags.enable_64bit_addressing = ((nv->host_p[1] & BIT_0) ? 1 : 0); ++ ha->flags.enable_lip_reset = ((nv->host_p[1] & BIT_1) ? 1 : 0); ++ ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0); ++ ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0); ++ ha->flags.enable_flash_db_update = ((nv->host_p[1] & BIT_4) ? 1 : 0); ++ ++ ha->flags.link_down_error_enable = 1; ++ ++ ha->flags.enable_target_mode = ++ ((icb->firmware_options[0] & BIT_4) ? 1 : 0); ++ ha->operating_mode = ++ (icb->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) >> 4; ++ ++ qla2x00_config_dma_addressing(ha); ++ ++ ha->fw_seriallink_options[0] = nv->seriallink_options[0]; ++ ha->fw_seriallink_options[1] = nv->seriallink_options[1]; ++ ++ /* save HBA serial number */ ++ ha->serial0 = icb->port_name[5]; ++ ha->serial1 = icb->port_name[6]; ++ ha->serial2 = icb->port_name[7]; ++ memcpy(ha->node_name, icb->node_name, WWN_SIZE); ++#if defined(FC_IP_SUPPORT) ++ memcpy(ha->ip_port_name, icb->port_name, WWN_SIZE); ++#endif ++ ++ ha->hiwat = le16_to_cpu(icb->max_iocb_allocation); ++ ha->execution_throttle = 0xFFFF; ++ icb->execution_throttle = __constant_cpu_to_le16(0xFFFF); ++ ++ ha->retry_count = nv->retry_count; ++ ++ /* Set minimum login_timeout to 4 seconds. */ ++ if (nv->login_timeout < ql2xlogintimeout) ++ nv->login_timeout = ql2xlogintimeout; ++ if (nv->login_timeout < 4) ++ nv->login_timeout = 4; ++ ha->login_timeout = nv->login_timeout; ++ icb->login_timeout = nv->login_timeout; ++ ++/* FIXME ++ * ++ * port_down_retry_count updated twice ++ * ++ */ ++ ha->port_down_retry_count = nv->port_down_retry_count; ++ ha->minimum_timeout = ++ (ha->login_timeout * ha->retry_count) + ha->port_down_retry_count; ++ ha->loop_reset_delay = nv->reset_delay; ++ ++ /* Will get the value from NVRAM. */ ++ ha->loop_down_timeout = LOOP_DOWN_TIMEOUT; ++ ha->loop_down_abort_time = LOOP_DOWN_TIME - ha->loop_down_timeout; ++ ++ /* save OEM related items for QLA2200s and QLA2300s */ ++ ha->oem_id = nv->oem_id; ++ memcpy(ha->oem_specific, nv->oem_specific, sizeof(ha->oem_specific)); ++ ++ ha->max_probe_luns = le16_to_cpu(nv->max_luns_per_target); ++ if (ha->max_probe_luns == 0) ++ ha->max_probe_luns = MIN_LUNS; ++ ++#if defined(IOCB_THROLLE_USAGE) ++ /* High-water mark of IOCBs */ ++ ha->iocb_hiwat = MAX_IOCBS_AVAILBALE; ++#endif ++ ++#if USE_BIOS_MAX_LUNS ++ ha->max_luns = le16_to_cpu(nv->max_luns_per_target); ++ if (ha->max_luns == 0) ++ ha->max_luns = MAX_LUNS; ++ else if (ha->max_luns > MAX_LUNS) ++ ha->max_luns = MAX_LUNS; ++#else ++ ha->max_luns = MAX_LUNS; ++#endif ++ ++/* FIXME ++ * ++ * port_down_retry_count updated twice ++ * ++ */ ++ /* ++ * Need enough time to try and get the port back. ++ */ ++ if (qlport_down_retry) ++ ha->port_down_retry_count = qlport_down_retry; ++ /* Set login_retry_count */ ++ ha->login_retry_count = nv->retry_count; ++ if (ha->port_down_retry_count == nv->port_down_retry_count && ++ ha->port_down_retry_count > 3) ++ ha->login_retry_count = ha->port_down_retry_count; ++ else if (ha->port_down_retry_count > ha->login_retry_count) ++ ha->login_retry_count = ha->port_down_retry_count; ++ ++ ha->binding_type = Bind; ++ if ((ha->binding_type != BIND_BY_PORT_NAME) && ++ (ha->binding_type != BIND_BY_PORT_ID) && ++ (ha->binding_type != BIND_BY_NODE_NAME)) { ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Invalid binding type specified (%d), " ++ "defaulting to BIND_BY_PORT_NAME!!!\n", ++ ha->host_no, ha->binding_type); ++ ++ ha->binding_type = BIND_BY_PORT_NAME; ++ } ++ ++ /* ++ * Setup ring parameters in initialization control block ++ */ ++ icb->request_q_outpointer = __constant_cpu_to_le16(0); ++ icb->response_q_inpointer = __constant_cpu_to_le16(0); ++ icb->request_q_length = __constant_cpu_to_le16(REQUEST_ENTRY_CNT); ++ icb->response_q_length = __constant_cpu_to_le16(RESPONSE_ENTRY_CNT); ++ icb->request_q_address[0] = cpu_to_le32(LSD(ha->request_dma)); ++ icb->request_q_address[1] = cpu_to_le32(MSD(ha->request_dma)); ++ icb->response_q_address[0] = cpu_to_le32(LSD(ha->response_dma)); ++ icb->response_q_address[1] = cpu_to_le32(MSD(ha->response_dma)); ++ ++ icb->lun_enables = __constant_cpu_to_le16(0); ++ icb->command_resource_count = 0; ++ icb->immediate_notify_resource_count = 0; ++ icb->timeout = __constant_cpu_to_le16(0); ++ ++ ha->flags.nvram_config_done = 1; ++ ++ if (status) { ++ DEBUG2_3(printk(KERN_WARNING ++ "scsi(%ld): NVRAM configuration failed!\n", ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/* ++* qla2x00_init_fc_db ++* Initializes Fibre Channel Device Database. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Output: ++* ha->fc_db = initialized ++*/ ++static void ++qla2x00_init_fc_db(scsi_qla_host_t *ha) ++{ ++ uint16_t cnt; ++ ++ ENTER(__func__); ++ ++ /* Initialize fc database if it is not initialized. */ ++ if (!ha->fc_db[0].loop_id && !ha->fc_db[1].loop_id) { ++ ha->flags.updated_fc_db = FALSE; ++ ++ /* Initialize target database. */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ ha->fc_db[cnt].name[0] = 0L; ++ ha->fc_db[cnt].name[1] = 0L; ++ ha->fc_db[cnt].loop_id = PORT_UNUSED; ++ ha->fc_db[cnt].port_login_retry_count = ++ ha->port_down_retry_count * PORT_RETRY_TIME; ++ ha->fc_db[cnt].flag = 0; /* v2.19.5b3 */ ++ } ++ } ++ ++ LEAVE(__func__); ++} ++ ++ ++/* ++* qla2x00_init_tgt_map ++* Initializes target map. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Output: ++* TGT_Q initialized ++*/ ++static void ++qla2x00_init_tgt_map(scsi_qla_host_t *ha) ++{ ++ uint32_t t; ++ ++ ENTER(__func__); ++ ++ for (t = 0; t < MAX_TARGETS; t++) ++ TGT_Q(ha, t) = (os_tgt_t *)NULL; ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_configure_loop ++ * Updates Fibre Channel Device Database with what is actually on loop. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Output: ++ * ha->fc_db = updated ++ * ++ * Returns: ++ * 0 = success. ++ * 1 = error. ++ * 2 = database was full and device was not configured. ++ */ ++static uint8_t ++qla2x00_configure_loop(scsi_qla_host_t *ha) ++{ ++ uint8_t rval = 0; ++ uint8_t rval1 = 0; ++ uint8_t enable_slot_reuse = FALSE; ++ uint16_t cnt; ++ static unsigned long flags, save_flags; ++#if defined(FC_IP_SUPPORT) ++ struct ip_device *ipdev; ++#endif ++ ++ ENTER(__func__); ++ ++ DEBUG(printk("scsi(%ld): Begin configure loop.\n", ha->host_no)); ++ ++ /* Get Initiator ID */ ++ if (qla2x00_configure_hba(ha)) { ++ DEBUG(printk("scsi(%ld): Unable to configure HBA.\n", ++ ha->host_no)); ++ return(1); ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ /* Disable all IP devices in linked list */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) ++ ipdev->flags &= ~IP_DEV_FLAG_PRESENT; ++#endif /* FC_IP_SUPPORT */ ++ ++ save_flags = flags = ha->dpc_flags; ++ DEBUG(printk("scsi(%ld): Configure loop -- dpc flags =0x%lx\n", ++ ha->host_no, flags)); ++ ++ /* dg 02/26/02 ha->dpc_flags &= ~(LOCAL_LOOP_UPDATE | RSCN_UPDATE); */ ++ ++ /* ++ * If we have both an RSCN and PORT UPDATE pending then handle them ++ * both at the same time. ++ */ ++ clear_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ clear_bit(RSCN_UPDATE, &ha->dpc_flags); ++ ha->mem_err = 0 ; ++ ++ /* Determine what we need to do */ ++ if (ha->current_topology == ISP_CFG_FL && ++ (test_bit(LOCAL_LOOP_UPDATE, &flags))) { ++ ++ ha->flags.rscn_queue_overflow = TRUE; ++ set_bit(RSCN_UPDATE, &flags); ++ ++ } else if (ha->current_topology == ISP_CFG_F && ++ (test_bit(LOCAL_LOOP_UPDATE, &flags))) { ++ ++ ha->flags.rscn_queue_overflow = TRUE; ++ set_bit(RSCN_UPDATE, &flags); ++ clear_bit(LOCAL_LOOP_UPDATE, &flags); ++ ++ } else if (!ha->flags.online || ++ (test_bit(ABORT_ISP_ACTIVE, &flags))) { ++ ++ ha->flags.rscn_queue_overflow = TRUE; ++ set_bit(RSCN_UPDATE, &flags); ++ set_bit(LOCAL_LOOP_UPDATE, &flags); ++ } ++ ++ do { ++ if (test_bit(LOCAL_LOOP_UPDATE, &flags)) { ++ rval = rval | ++ qla2x00_configure_local_loop(ha, enable_slot_reuse); ++ } ++ ++ if (test_bit(RSCN_UPDATE, &flags)) { ++ rval1 = qla2x00_configure_fabric(ha, enable_slot_reuse); ++ if ((rval1 & BIT_0) && ha->sns_retry_cnt < 8) { ++ ha->sns_retry_cnt++; ++ set_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); ++ } ++ } ++ ++ /* If devices not configured first time try reusing slots.*/ ++ if (enable_slot_reuse == FALSE && (rval & BIT_1)) ++ enable_slot_reuse = TRUE; ++ else ++ enable_slot_reuse = FALSE; ++ ++ /* Isolate error status. */ ++ if (rval & BIT_0) { ++ rval = 1; ++ } else { ++ rval = 0; ++ } ++ ++ } while (enable_slot_reuse == TRUE && rval == 0); ++ ++ if (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))) { ++ ++ /* Mark devices that are not present as DEV_ABSENCE */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (ha->fc_db[cnt].loop_id & PORT_LOST_ID) { ++ ha->fc_db[cnt].flag |= DEV_ABSENCE; ++ } else { ++ /* device returned */ ++ if (ha->fc_db[cnt].loop_id < ++ LAST_SNS_LOOP_ID && ++ ha->fc_db[cnt].flag & DEV_ABSENCE) { ++ ha->fc_db[cnt].flag &= ~DEV_ABSENCE; ++ ha->fc_db[cnt].flag |= DEV_RETURN; ++ ha->fc_db[cnt].port_login_retry_count = ++ ha->port_down_retry_count * ++ PORT_RETRY_TIME; ++ } ++ } ++ } ++ ++ rval1 = qla2x00_build_fcport_list(ha); ++ if (((rval1 & BIT_0) || ha->mem_err != 0) && ++ ha->sns_retry_cnt < 8) { ++ ++ ha->sns_retry_cnt++; ++ set_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); ++ } ++ ++ if (!ha->flags.failover_enabled) ++ qla2x00_config_os(ha); ++ ++ /* If we found all devices then go ready */ ++ if (!(test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags))) { ++ ha->loop_state = LOOP_READY; ++ ++ if (ha->flags.failover_enabled) { ++ DEBUG(printk("scsi(%ld): schedule FAILBACK " ++ "EVENT\n", ha->host_no)); ++ if (!(test_and_set_bit(FAILOVER_EVENT_NEEDED, ++ &ha->dpc_flags))) { ++ ha->failback_delay = failbackTime; ++ } ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ ha->failover_type = MP_NOTIFY_LOOP_UP; ++ } ++ ++ DEBUG(printk("scsi(%ld): LOOP READY\n", ha->host_no)); ++ } else { ++ if (test_bit(LOCAL_LOOP_UPDATE, &save_flags)) ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ if (test_bit(RSCN_UPDATE, &save_flags)) ++ set_bit(RSCN_UPDATE, &ha->dpc_flags); ++ } ++ } else { ++ DEBUG(printk("scsi(%ld): Loop down counter running= %d or " ++ "Resync needed- dpc flags= %ld\n", ++ ha->host_no, ++ atomic_read(&ha->loop_down_timer), ha->dpc_flags)); ++ /* ???? dg 02/26/02 rval = 1; */ ++ } ++ ++ if (rval) { ++ DEBUG2_3(printk("%s(%ld): *** FAILED ***\n", ++ __func__, ha->host_no)); ++ } else { ++ DEBUG3(printk("%s: exiting normally\n", __func__)); ++ } ++ ++ return(rval); ++} ++ ++/* ++ * qla2x00_configure_local_loop ++ * Updates Fibre Channel Device Database with local loop devices. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * enable_slot_reuse = allows the use of PORT_AVAILABLE slots. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = error. ++ * BIT_1 = database was full and a device was not configured. ++ */ ++static uint8_t ++qla2x00_configure_local_loop(scsi_qla_host_t *ha, uint8_t enable_slot_reuse) ++{ ++ uint8_t status = 0; ++ uint8_t rval; ++ uint8_t port_name[8]; ++ uint8_t update_status = 0; ++ uint16_t index, size; ++ dma_addr_t phys_address = 0; ++ fcdev_t device; ++ port_list_entry_t *gn_list, *port_entry; ++ uint16_t localdevices = 0; ++#if defined(FC_IP_SUPPORT) ++ uint16_t list_entry_loop_id; ++#endif ++ ++ ENTER(__func__); ++ ++ /* ++ * No point in continuing if the loop is in a volatile state -- ++ * reschedule LOCAL_LOOP_UPDATE for later processing ++ */ ++ if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) { ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ return (0); ++ } ++ ++ gn_list = pci_alloc_consistent(ha->pdev, ++ sizeof(GN_LIST_LENGTH), &phys_address); ++ if (gn_list == NULL) { ++ DEBUG2(printk("scsi(%ld): Failed to allocate memory, No local " ++ "loop\n", ++ ha->host_no)); ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - port_list", ++ ha->host_no); ++ ++ ha->mem_err++; ++ return (BIT_0); ++ } ++ memset(gn_list, 0, sizeof(GN_LIST_LENGTH)); ++ ++ /* Mark all local devices PORT_LOST_ID first */ ++ for (index = 0; index < MAX_FIBRE_DEVICES; index++) { ++ if (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID && ++ !(ha->fc_db[index].flag & DEV_PUBLIC)) { ++ ++ DEBUG(printk("scsi(%ld): Marking port lost @ slot " ++ "%d %02x%02x%02x\n", ++ ha->host_no, ++ index, ++ ha->fc_db[index].d_id.b.domain, ++ ha->fc_db[index].d_id.b.area, ++ ha->fc_db[index].d_id.b.al_pa)); ++ ++ ha->fc_db[index].loop_id |= PORT_LOST_ID; ++ } ++ } ++ ++ DEBUG3(printk("scsi(%ld): Getting FCAL position map\n", ha->host_no)); ++ DEBUG3(qla2x00_get_fcal_position_map(ha, NULL)); ++ ++ /* Get port name list ++ * ++ * Via qla2x00_get_port_list: ++ * ++ * Bit 0 - return node names, ++ * Bit 1 - loop IDs 0-255 ++ */ ++#if defined(FC_IP_SUPPORT) ++ if (ha->flags.enable_ip == FALSE) ++ rval = qla2x00_get_port_list(ha, ++ gn_list, phys_address, BIT_0, &size); ++ else ++ rval = qla2x00_get_port_list(ha, ++ gn_list, phys_address, BIT_0|BIT_1, &size); ++#else ++ rval = qla2x00_get_port_list(ha, gn_list, phys_address, BIT_0, &size); ++#endif ++ if (rval) { ++ status = BIT_0; ++ goto cleanup_allocation; ++ } ++ ++ DEBUG3(printk("scsi(%ld): Port list size (%d)\n", ha->host_no, size)); ++ DEBUG3(qla2x00_dump_buffer((uint8_t *)gn_list, size)); ++ ++ /* Any valid entries returned? */ ++ if (size / sizeof(port_list_entry_t) == 0) ++ goto cleanup_allocation; ++ ++ port_entry = gn_list; ++ for ( ; size >= sizeof(port_list_entry_t); ++ size -= sizeof(port_list_entry_t), port_entry++) { ++ ++ device.loop_id = le16_to_cpu(port_entry->loop_id); ++ ++#if defined(FC_IP_SUPPORT) ++ list_entry_loop_id = device.loop_id; ++ device.loop_id &= LOOP_ID_MASK; ++#endif ++ ++ /* Skip any non-local loop-ids - this includes 'known ports' */ ++ if (device.loop_id > LAST_LOCAL_LOOP_ID) ++ continue; ++#if NOT_NEEDED ++ /* Skip the known ports. */ ++ if ((device.loop_id == SNS_FL_PORT) || ++ (device.loop_id == FABRIC_CONTROLLER) || ++ (device.loop_id == SIMPLE_NAME_SERVER)) ++ continue; ++#endif ++ ++ device.flag = 0; ++ ++ /* Prep node name -- big-endian format */ ++ *((u64 *)device.name) = __swab64p((u64 *)port_entry->name); ++ ++ /* Retrieve port name */ ++ rval = qla2x00_get_port_name(ha, device.loop_id, port_name, 0); ++ if (rval || qla2x00_is_wwn_zero(port_name)) { ++ DEBUG2(printk("scsi(%ld): Loop -- error retrieving " ++ "port_name.\n", ++ ha->host_no)); ++ ++ status = BIT_0; ++ break; ++ } ++ memcpy(device.wwn, port_name, WWN_SIZE); ++ ++ /* Derive portid from alpa table */ ++ device.d_id.b24 = 0; ++ device.d_id.b.al_pa = alpa_table[device.loop_id]; ++ ++ DEBUG2_3(printk("scsi(%ld): Loop scan found device - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid %02x%02x%02x.\n", ++ ha->host_no, ++ device.name[0], device.name[1], ++ device.name[2], device.name[3], ++ device.name[4], device.name[5], ++ device.name[6], device.name[7], ++ device.wwn[0], device.wwn[1], device.wwn[2], device.wwn[3], ++ device.wwn[4], device.wwn[5], device.wwn[6], device.wwn[7], ++ device.d_id.b.domain, ++ device.d_id.b.area, ++ device.d_id.b.al_pa)); ++ ++#if !defined(FC_IP_SUPPORT) ++ /* SCSI type device */ ++ update_status = qla2x00_update_fc_database(ha, ++ &device, enable_slot_reuse); ++ if (update_status) ++ status |= update_status; ++ else ++ localdevices++; ++#else ++ if (!(list_entry_loop_id & PLE_NOT_SCSI_DEVICE)) { ++ /* SCSI type device */ ++ update_status = qla2x00_update_fc_database(ha, ++ &device, enable_slot_reuse); ++ ++ if (update_status) ++ status |= update_status; ++ else ++ localdevices++; ++ } else if (ha->flags.enable_ip == TRUE) { ++ /* SCSI login failed, assume it is IP device */ ++ DEBUG12(printk("scsi(%ld): Loop scan found IP device " ++ "WWNN:%02x%02x%02x%02x%02x%02x%02x%02x " ++ "DID:%02x%02x%02x.\n", ++ ha->host_no, ++ device.name[0], device.name[1], ++ device.name[2], device.name[3], ++ device.name[4], device.name[5], ++ device.name[6], device.name[7], ++ device.d_id.b.domain, ++ device.d_id.b.area, ++ device.d_id.b.al_pa)); ++ ++ update_status = ++ qla2x00_update_ip_device_data(ha, &device); ++ if (update_status == QL_STATUS_SUCCESS) ++ localdevices++; ++ else if (update_status == QL_STATUS_RESOURCE_ERROR) ++ status |= BIT_1; ++ else ++ status |= BIT_0; ++ } ++#endif ++ } /* for each port entry */ ++ ++cleanup_allocation: ++ pci_free_consistent(ha->pdev, ++ sizeof(GN_LIST_LENGTH), gn_list, phys_address); ++ ++ if (status & BIT_0) { ++ DEBUG2(printk("scsi(%ld): Configure local loop error exit: " ++ "rval=%x\n", ha->host_no, rval)); ++ } ++ ++ if (localdevices > 0) { ++ ha->device_flags |= DFLG_LOCAL_DEVICES; ++ ha->device_flags &= ~DFLG_RETRY_LOCAL_DEVICES; ++ } ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/* ++ * qla2x00_configure_fabric ++ * Setup SNS devices with loop ID's. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = error ++ * BIT_1 = database was full and device was not configured. ++ */ ++#define MAX_PUBLIC_LOOP_IDS LAST_SNS_LOOP_ID + 1 ++ ++static uint8_t ++qla2x00_configure_fabric(scsi_qla_host_t *ha, uint8_t enable_slot_reuse) ++{ ++ uint8_t rval = 0; ++ uint8_t rval1; ++ uint8_t local_flags = 0; ++ uint8_t tmp_name[8]; ++ fcdev_t dev; ++ uint16_t i, index, found_cnt; ++ uint16_t new_dev_cnt; ++ uint16_t tmp_loop_id; ++ uint16_t tmp_topo; ++ struct new_dev *new_dev_list; ++ struct list_head *fcil, *fcitemp; ++ fc_initiator_t *fcinitiator; ++ ++ ENTER(__func__); ++ ++ DEBUG2(printk("scsi(%ld): Begin configure fabric -- hba=%p\n", ++ ha->host_no, ha)); ++ ++ /* If FL port exists, then SNS is present */ ++ rval1 = qla2x00_get_port_name(ha, SNS_FL_PORT, tmp_name, 0); ++ if (rval1 || qla2x00_is_wwn_zero(tmp_name)) { ++ DEBUG2(printk("scsi(%ld): MBC_GET_PORT_NAME Failed, No FL " ++ "Port\n", ha->host_no)); ++ ++ ha->device_flags &= ~SWITCH_FOUND; ++ return (0); ++ } ++ ++ new_dev_list = kmalloc(sizeof(struct new_dev) * MAX_FIBRE_DEVICES, ++ GFP_ATOMIC); ++ if (new_dev_list == NULL) { ++ DEBUG2(printk("scsi(%ld): Configure Fabric allocation failed, " ++ "device list\n", ha->host_no)); ++ ha->mem_err++; ++ return (BIT_0); ++ } ++ ++ /* Get adapter port ID. */ ++ rval = qla2x00_get_adapter_id(ha, &tmp_loop_id, ++ &ha->d_id.b.al_pa, &ha->d_id.b.area, &ha->d_id.b.domain, &tmp_topo); ++ ++ /* Mark devices that need re-synchronization. */ ++ qla2x00_device_resync(ha); ++ found_cnt = 0; ++ do { ++ if (test_and_clear_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags)) { ++ if (qla2x00_rft_id(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register FC-4 " ++ "TYPE failed.\n", ha->host_no)); ++ } ++ if (qla2x00_rff_id(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register FC-4 " ++ "Features failed.\n", ha->host_no)); ++ } ++ if (qla2x00_rnn_id(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register Node Name " ++ "failed.\n", ha->host_no)); ++ } ++ if (qla2x00_rsnn_nn(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register Symbolic " ++ "Node Name failed.\n", ha->host_no)); ++ } ++ } ++ ++ rval = qla2x00_find_all_fabric_devs(ha, ++ new_dev_list, &new_dev_cnt, &local_flags); ++ if (rval != 0) ++ break; ++ ++ /* ++ * Logout all previous fabric devices marked lost, except ++ * tape devices. ++ */ ++ for (index = 0; index < MAX_FIBRE_DEVICES && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { ++ ++ if (ha->fc_db[index].loop_id & PORT_LOST_ID && ++ (ha->fc_db[index].flag & DEV_PUBLIC) && ++ !(ha->fc_db[index].flag & DEV_TAPE_DEVICE)) { ++ ++ qla2x00_fabric_logout(ha, ++ ha->fc_db[index].loop_id & 0xff); ++ local_flags |= LOGOUT_PERFORMED; ++ } ++ } ++ ++ /* Logout and remove any lost initiator devices */ ++ list_for_each_safe(fcil, fcitemp, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if ((fcinitiator->loop_id & PORT_LOST_ID) == 0) ++ continue; ++ ++ qla2x00_fabric_logout(ha, fcinitiator->loop_id & 0xff); ++ ha->fabricid[fcinitiator->loop_id &0xFF].in_use = FALSE; ++ ++ list_del(&fcinitiator->list); ++ kfree(fcinitiator); ++ } ++ ++ /* ++ * Scan through our database and login entries already in our ++ * database. ++ */ ++ for (index = 0; index < MAX_FIBRE_DEVICES && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { ++ ++ if (!(ha->fc_db[index].loop_id & PORT_LOGIN_NEEDED)) ++ continue; ++ ++ ha->fc_db[index].loop_id &= ~PORT_LOGIN_NEEDED; ++ if (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID) { ++ /* loop_id reusable */ ++ dev.loop_id = ha->fc_db[index].loop_id & 0xff; ++ } else { ++ for (i = ha->min_external_loopid; ++ i < MAX_PUBLIC_LOOP_IDS; i++) { ++ ++ if (!ha->fabricid[i].in_use) { ++ ha->fabricid[i].in_use = TRUE; ++ dev.loop_id = i; ++ break; ++ } ++ } ++ ++ if (i == MAX_PUBLIC_LOOP_IDS) ++ break; ++ } ++ ++ dev.d_id.b24 = ha->fc_db[index].d_id.b24; ++ ++ /* login and update database */ ++ if (qla2x00_fabric_login(ha, &dev) == 0) { ++ ha->fc_db[index].loop_id = dev.loop_id; ++ found_cnt++; ++ } ++ } ++ ++ /* ++ * Scan through new device list and login and add to our ++ * database. ++ */ ++ for (index = 0; index < new_dev_cnt && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { ++ ++ memcpy(&dev, ++ &new_dev_list[index], sizeof(struct new_dev)); ++ ++ dev.flag = DEV_PUBLIC; ++ ++ for (i = ha->min_external_loopid; ++ i < MAX_PUBLIC_LOOP_IDS; i++) { ++ ++ if (!ha->fabricid[i].in_use) { ++ ha->fabricid[i].in_use = TRUE; ++ dev.loop_id = i; ++ break; ++ } ++ } ++ ++ if (i == MAX_PUBLIC_LOOP_IDS) ++ break; ++ ++ if (qla2x00_fabric_login(ha, &dev) == 0) { ++ found_cnt++; ++ rval = qla2x00_update_fc_database(ha, ++ &dev, enable_slot_reuse); ++ ++ if (rval) { ++ qla2x00_fabric_logout(ha, dev.loop_id); ++ ha->fabricid[i].in_use = FALSE; ++ break; ++ } ++ } ++ } ++ } while(0); ++ ++ kfree(new_dev_list); ++ ++ if (rval) { ++ DEBUG2(printk("scsi(%ld): Configure fabric error exit: " ++ "rval=%d\n", ha->host_no, rval)); ++ } else { ++ /* EMPTY */ ++ DEBUG2(if (found_cnt)) ++ DEBUG2(printk("scsi(%ld) Found (%d) ports\n", ++ ha->host_no, found_cnt)); ++ } ++ ++ LEAVE(__func__); ++ ++ return(rval); ++} ++ ++ ++/* ++ * qla2x00_find_all_fabric_devs ++ * Go through GAN list to find all fabric devices. Will perform ++ * necessary logout of previously existed devices that have changed ++ * and save new devices in a new device list. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * dev = database device entry pointer. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = error. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, ++ struct new_dev *new_dev_list, uint16_t *new_dev_cnt, uint8_t *flags) ++{ ++ fcdev_t dev; ++ uint8_t rval = 0; ++ int status = 0; ++ uint16_t i; ++ uint16_t index; ++ uint16_t new_cnt; ++ uint16_t public_count; ++ uint16_t initiator; ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ sw_info_t *swl; ++ sw_info_t swl_entry; ++ int swl_idx; ++ int first_dev, last_dev; ++ port_id_t wrap; ++ int ip_dev; ++ ++ ENTER(__func__); ++ ++ /* Try GID_PT to get device list, else GAN. */ ++ swl = kmalloc(sizeof(sw_info_t) * MAX_FIBRE_DEVICES, GFP_ATOMIC); ++ if (swl == NULL) { ++ /*EMPTY*/ ++ DEBUG2(printk("scsi(%ld): GID_PT allocations failed, fallback " ++ "on GAN\n", ha->host_no)); ++ } else if (qla2x00_gid_pt(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } else if (qla2x00_gpn_id(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } else if (qla2x00_gnn_id(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } else if (qla2x00_gft_id(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } ++ swl_idx = 0; ++ ++ /* ++ * Loop getting devices from switch. Logout the devices that were in ++ * our database but changed port ID. ++ */ ++#if defined(ISP2100) ++ ha->max_public_loop_ids = LAST_SNS_LOOP_ID - SNS_FIRST_LOOP_ID + 1; ++ public_count = ha->max_public_loop_ids; ++#else ++ ha->max_public_loop_ids = MAX_PUBLIC_LOOP_IDS; ++ public_count = ha->max_public_loop_ids - ha->min_external_loopid + 2; ++#endif ++ ++ /* Set start port ID scan at adapter ID. */ ++ swl_entry.d_id.b24 = ha->d_id.b24; ++ first_dev = 1; ++ last_dev = 0; ++ ++ new_cnt = 0; /* new device count */ ++ ++ for (i = 0; ++ i < public_count && !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); i++) { ++ ++ if (swl != NULL) { ++ if (last_dev) { ++ wrap.b24 = dev.d_id.b24; ++ } else { ++ dev.flag = DEV_PUBLIC; ++ dev.d_id.b24 = swl[swl_idx].d_id.b24; ++ memcpy(dev.name, ++ swl[swl_idx].node_name, WWN_SIZE); ++ memcpy(dev.wwn, ++ swl[swl_idx].port_name, WWN_SIZE); ++ ++ /* IP capable device */ ++ ip_dev = 0; ++ if (swl[swl_idx].type & SW_TYPE_IP) ++ ip_dev = 1; ++ ++ if (swl[swl_idx].d_id.b.rsvd_1 != 0) { ++ last_dev = 1; ++ } ++ swl_idx++; ++ } ++ } else { ++ /* Send GAN to the switch */ ++ rval = 0; ++ if (qla2x00_ga_nxt(ha, &swl_entry) != ++ QL_STATUS_SUCCESS) { ++ rval |= BIT_0; ++ break; ++ } ++ ++ dev.flag = DEV_PUBLIC; ++ dev.d_id.b24 = swl_entry.d_id.b24; ++ memcpy(dev.name, swl_entry.node_name, WWN_SIZE); ++ memcpy(dev.wwn, swl_entry.port_name, WWN_SIZE); ++ ++ /* IP capable device */ ++ ip_dev = 0; ++ if (swl_entry.type & SW_TYPE_IP) ++ ip_dev = 1; ++ } ++ ++ /* If wrap on switch device list, exit. */ ++ if (first_dev) { ++ wrap.b24 = dev.d_id.b24; ++ first_dev = 0; ++ } else if (dev.d_id.b24 == wrap.b24) { ++ DEBUG2(printk("scsi(%ld): device wrap (%02x%02x%02x)\n", ++ ha->host_no, ++ dev.d_id.b.domain, ++ dev.d_id.b.area, ++ dev.d_id.b.al_pa)); ++ break; ++ } ++ ++ DEBUG(printk("scsi(%ld): Fabric scan found device(%d) - port " ++ "Id=%02x%02x%02x\n", ++ ha->host_no, i, ++ dev.d_id.b.domain, dev.d_id.b.area, dev.d_id.b.al_pa)); ++ ++ /* Bypass if host adapter. */ ++ if (dev.d_id.b24 == ha->d_id.b24) ++ continue; ++ ++ /* Bypass reserved domain fields. */ ++ if ((dev.d_id.b.domain & 0xf0) == 0xf0) ++ continue; ++ ++ /* Bypass if same domain and area of adapter. */ ++ if ((dev.d_id.b24 & 0xffff00) == (ha->d_id.b24 & 0xffff00)) ++ continue; ++ ++#if defined(FC_IP_SUPPORT) ++ /* Check for IP device */ ++ if (ip_dev) { ++ /* Found IP device */ ++ DEBUG12(printk("scsi(%ld): IP fabric " ++ "WWN: %02x%02x%02x%02x%02x%02x%02x%02x " ++ "DID: %02x%02x%02x.\n", ++ ha->host_no, ++ dev.name[0], dev.name[1], dev.name[2], dev.name[3], ++ dev.name[4], dev.name[5], dev.name[6], dev.name[7], ++ dev.d_id.b.domain, ++ dev.d_id.b.area, ++ dev.d_id.b.al_pa)); ++ ++ qla2x00_update_ip_device_data(ha, &dev); ++ continue; ++ } ++#endif ++ ++ /* Bypass if initiator */ ++ initiator = FALSE; ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(dev.wwn, fcinitiator->port_name, 8) != 0) ++ continue; ++ ++ initiator = TRUE; ++ DEBUG(printk("scsi(%ld): found host " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "portid=%02x%02x%02x.\n", ++ ha->host_no, ++ dev.name[0], dev.name[1], dev.name[2], dev.name[3], ++ dev.name[4], dev.name[5], dev.name[6], dev.name[7], ++ dev.d_id.b.domain, ++ dev.d_id.b.area, ++ dev.d_id.b.al_pa)); ++ ++ /* ++ * If the initiator was marked as lost, perform the ++ * required logout and relogin the initiator by ++ * assuming a new device. ++ */ ++ if ((fcinitiator->loop_id & PORT_LOST_ID) == 0) ++ break; ++ ++ initiator = FALSE; ++ break; ++ } ++ ++ /* Bypass if initiator */ ++ if (initiator) ++ continue; ++ ++ /* Locate matching device in database. */ ++ for (index = 0; index < MAX_FIBRE_DEVICES; index++) { ++ if (ha->fc_db[index].loop_id == PORT_UNUSED) ++ continue; ++ ++ status = 1; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ status = memcmp(dev.wwn, ++ ha->fc_db[index].wwn, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ status = (dev.d_id.b24 != ++ ha->fc_db[index].d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ status = memcmp(dev.name, ++ ha->fc_db[index].name, WWN_SIZE); ++ break; ++ } ++ if (status) ++ continue; ++ ++ /* ++ * Update volatile unbound fields for PortID binding ++ * only ++ */ ++ if (ha->binding_type == BIND_BY_PORT_ID) { ++ memcpy(ha->fc_db[index].name, ++ dev.name, WWN_SIZE); ++ memcpy(ha->fc_db[index].wwn, ++ dev.wwn, WWN_SIZE); ++ } ++ ++ /* Now we found a matching device name */ ++ DEBUG(printk("scsi(%ld): Found fabric dev %d in " ++ "tgt %d db, flags= 0x%x, loop_id=0x%04x, port=" ++ "%02x%02x%02x, " ++ "name=%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ ha->host_no, i, index, ++ ha->fc_db[index].flag, ++ ha->fc_db[index].loop_id, ++ ha->fc_db[index].d_id.b.domain, ++ ha->fc_db[index].d_id.b.area, ++ ha->fc_db[index].d_id.b.al_pa, ++ dev.wwn[0], dev.wwn[1], dev.wwn[2], dev.wwn[3], ++ dev.wwn[4], dev.wwn[5], dev.wwn[6], dev.wwn[7])); ++ ++ if (!(ha->fc_db[index].flag & DEV_PUBLIC)) { ++ /* ++ * This was in our database as a local device. ++ * Here we assume this device either has ++ * changed location so configure_local_loop has ++ * already done necessary clean up, or it's ++ * saved here due to persistent name binding. ++ * We'll just add it in as a fabric device. ++ */ ++ /* Copy port id and name fields. */ ++ ha->fc_db[index].flag |= DEV_PUBLIC; ++ ha->fc_db[index].d_id.b24 = dev.d_id.b24; ++ ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED; ++ ++ break; ++ } ++ ++ /* This was in our database as a fabric device. */ ++ if ((ha->fc_db[index].d_id.b24 == dev.d_id.b24) && ++ (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID)) ++ /* Device didn't change */ ++ break; ++ ++ if (ha->fc_db[index].loop_id == PORT_AVAILABLE) { ++ ha->fc_db[index].flag |= DEV_PUBLIC; ++ ha->fc_db[index].d_id.b24 = dev.d_id.b24; ++ ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED; ++ break; ++ } ++ ++ /* ++ * Port ID changed or device was marked to be updated; ++ * logout and mark it for relogin later. ++ */ ++ qla2x00_fabric_logout(ha, ++ ha->fc_db[index].loop_id & 0xff); ++ ha->fc_db[index].flag |= DEV_PUBLIC; ++ ha->fc_db[index].d_id.b24 = dev.d_id.b24; ++ ++ ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED; ++ ha->fc_db[index].loop_id &= ~PORT_LOST_ID; ++ ++ *flags |= LOGOUT_PERFORMED; ++ ++ break; ++ } ++ ++ if (index == MAX_FIBRE_DEVICES) { ++ /* ++ * Did not find a match in our database. This is a new ++ * device. ++ */ ++ DEBUG3(printk("scsi(%ld): Found new device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ ha->host_no, ++ dev.wwn[0], dev.wwn[1], dev.wwn[2], dev.wwn[3], ++ dev.wwn[4], dev.wwn[5], dev.wwn[6], dev.wwn[7])); ++ ++ memcpy(&new_dev_list[new_cnt], ++ &dev, sizeof(struct new_dev)); ++ new_cnt++; ++ } ++ } ++ ++ if (swl) ++ kfree(swl); ++ ++ *new_dev_cnt = new_cnt; ++ ++ if (new_cnt > 0) ++ ha->device_flags |= DFLG_FABRIC_DEVICES; ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_device_resync ++ * Marks devices in the database that needs resynchronization. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_device_resync(scsi_qla_host_t *ha) ++{ ++ uint16_t index; ++ uint32_t mask; ++ rscn_t dev; ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ ENTER(__func__); ++ ++ while (ha->rscn_out_ptr != ha->rscn_in_ptr || ++ ha->flags.rscn_queue_overflow) { ++ ++ memcpy(&dev, &ha->rscn_queue[ha->rscn_out_ptr], sizeof(rscn_t)); ++ ++ DEBUG(printk("scsi(%ld): device_resync: rscn_queue[%d], " ++ "portID=%02x%02x%02x.\n", ++ ha->host_no, ++ ha->rscn_out_ptr, ++ ha->rscn_queue[ha->rscn_out_ptr].d_id.b.domain, ++ ha->rscn_queue[ha->rscn_out_ptr].d_id.b.area, ++ ha->rscn_queue[ha->rscn_out_ptr].d_id.b.al_pa)); ++ ++ ha->rscn_out_ptr++; ++ if (ha->rscn_out_ptr == MAX_RSCN_COUNT) ++ ha->rscn_out_ptr = 0; ++ ++ /* Queue overflow, set switch default case. */ ++ if (ha->flags.rscn_queue_overflow) { ++ DEBUG(printk("scsi(%ld): device_resync: rscn " ++ "overflow.\n", ha->host_no)); ++ ++ dev.format = 3; ++ ha->flags.rscn_queue_overflow = 0; ++ } ++ ++ switch (dev.format) { ++ case 0: ++ mask = 0xffffff; ++ break; ++ case 1: ++ mask = 0xffff00; ++ break; ++ case 2: ++ mask = 0xff0000; ++ break; ++ default: ++ mask = 0x0; ++ dev.d_id.b24 = 0; ++ ha->rscn_out_ptr = ha->rscn_in_ptr; ++ break; ++ } ++ ++ /* Mark target devices indicated by RSCN for later processing */ ++ for (index = 0; index < MAX_FIBRE_DEVICES; index++) { ++ if ((ha->fc_db[index].flag & DEV_PUBLIC) && ++ (ha->fc_db[index].d_id.b24 & mask) == ++ dev.d_id.b24) { ++ ++ /* fabric device */ ++ if (ha->fc_db[index].loop_id != PORT_UNUSED) { ++ ha->fc_db[index].loop_id |= ++ PORT_LOST_ID; ++ ++ DEBUG(printk("scsi(%ld): RSCN port @ " ++ "slot %d port_id=%02x%02x%02x.\n", ++ ha->host_no, ++ index, ++ ha->fc_db[index].d_id.b.domain, ++ ha->fc_db[index].d_id.b.area, ++ ha->fc_db[index].d_id.b.al_pa)); ++ } ++ } ++ } ++ ++ if (dev.format == 3) ++ continue; ++ ++ /* ++ * Invalidate initiator devices indicated by RSCN so we know ++ * they are no longer logged in. ++ */ ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if ((fcinitiator->d_id.b24 & mask) != dev.d_id.b24) ++ continue; ++ if (fcinitiator->loop_id & PORT_LOST_ID || ++ fcinitiator->loop_id & PORT_LOGIN_NEEDED) ++ continue; ++ ++ fcinitiator->loop_id |= PORT_LOST_ID; ++ fcinitiator->d_id.b24 = 0; ++ } ++ } ++ ++ LEAVE(__func__); ++} ++ ++ ++/* ++ * qla2x00_loop_resync ++ * Resync with fibre channel devices. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * 0 = success ++ */ ++uint8_t ++qla2x00_loop_resync(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ ++ ENTER(__func__); ++ ++ ha->loop_state = LOOP_UPDATE; ++ qla2x00_stats.loop_resync++; ++ clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ if (ha->flags.online) { ++ if (!(status = qla2x00_fw_ready(ha))) { ++ do { ++ /* v2.19.05b6 */ ++ ha->loop_state = LOOP_UPDATE; ++ ++ /* ++ * Issue marker command only when we are going ++ * to start the I/O . ++ */ ++ ha->marker_needed = 1; ++ ++ /* Remap devices on Loop. */ ++ clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ ++ qla2x00_configure_loop(ha); ++ ++ } while (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) && ++ (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))); ++ } ++ qla2x00_restart_queues(ha,TRUE); ++ } else ++ status = 0; ++ ++ if (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) { ++ return (1); ++ } ++ ++ if (status) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ } ++ ++ LEAVE(__func__); ++ ++ return(status); ++} ++ ++/* ++ * qla2x00_fabric_login ++ * Issue fabric login command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * device = pointer to FC device type structure. ++ * ++ * Returns: ++ * 0 - Login successfully ++ * 1 - Login failed ++ * 2 - Initiator device ++ * 3 - Fatal error ++ */ ++uint8_t ++qla2x00_fabric_login(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ uint16_t status[3]; ++ ++ for (;;) { ++ DEBUG(printk("scsi(%ld): Trying Fabric Login w/loop id 0x%04x " ++ "for port %02x%02x%02x.\n", ++ ha->host_no, device->loop_id, ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa)); ++ ++ /* Login device on switch. */ ++ qla2x00_login_fabric(ha, ++ device->loop_id, device->d_id.b.domain, ++ device->d_id.b.area, device->d_id.b.al_pa, ++ &status[0], BIT_0); ++ ++ if (status[0] == 0x4007) { ++ ha->fabricid[device->loop_id].in_use = FALSE; ++ device->loop_id = status[1]; ++ ++ DEBUG(printk("Fabric Login: port in use - next " ++ "loop id=0x%04x, port Id=%02x%02x%02x.\n", ++ device->loop_id, ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa)); ++ ++ if (device->loop_id <= LAST_SNS_LOOP_ID) ++ ha->fabricid[device->loop_id].in_use = TRUE; ++ else ++ return 1; ++ ++ } else if (status[0] == 0x4000) { ++ if (status[1] & 0x0001) { ++ /* Initiator only device */ ++ qla2x00_add_initiator_device(ha, device); ++ ++ return 2; ++ } ++ ++ /* This is target capable device */ ++ qla2x00_get_port_database(ha, device, 0); ++ ++ DEBUG(printk("scsi(%ld): Fabric Login OK. loop " ++ "id=0x%04x, port Id=%02x%02x%02x.\n", ++ ha->host_no, ++ device->loop_id, ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa)); ++ return 0; ++ ++ } else if (status[0] == 0x4008) { ++ if (device->loop_id++ <= LAST_SNS_LOOP_ID) ++ ha->fabricid[device->loop_id].in_use = TRUE; ++ else ++ return 1; ++ ++ } else if (status[0] == 0x4006) { ++ /* No more retry needed. */ ++ return 3; ++ } else { ++ DEBUG2(printk("%s(%ld): failed=%x port_id=%02x%02x%02x " ++ "loop_id=%x jiffies=%lx.\n", ++ __func__, ha->host_no, status[0], ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa, ++ device->loop_id, jiffies)); ++ return 1; ++ } ++ } ++} ++ ++/* ++ * qla2x00_local_device_login ++ * Issue local device login command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = loop id of device to login to. ++ * ++ * Returns (Where's the #define!!!!): ++ * 0 - Login successfully ++ * 1 - Login failed ++ * 3 - Fatal error ++ */ ++uint8_t ++qla2x00_local_device_login(scsi_qla_host_t *ha, uint16_t loop_id) ++{ ++ int rval; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ ++ memset(mb, 0, sizeof(mb)); ++ rval = qla2x00_login_local_device(ha, loop_id, mb, BIT_0); ++ if (rval == QL_STATUS_SUCCESS) { ++ /* Interrogate mailbox registers for any errors */ ++ if (mb[0] == 0x4005) ++ rval = 1; ++ else if (mb[0] == 0x4006) ++ /* device not in PCB table */ ++ rval = 3; ++ } ++ return rval; ++} ++ ++ ++/** ++ * qla2x00_ga_nxt() - SNS scan for fabric devices via GA_NXT command. ++ * @ha: HA context ++ * @swl_entry: switch info entry to updated ++ * ++ * NOTE: Non-Nx_Ports are skipped. ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_ga_nxt(scsi_qla_host_t *ha, sw_info_t *swl_entry) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++retry_ga_nxt: ++ /* Issue GA_NXT */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, GA_NXT_REQ_SIZE, GA_NXT_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GA_NXT_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GA_NXT_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = swl_entry->d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = swl_entry->d_id.b.area; ++ ct_req->req.port_id.port_id[2] = swl_entry->d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GA_NXT issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, " ++ "ga_nxt_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE && ++ ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) { ++ /* We're only interested in Nx ports */ ++ DEBUG2_3(printk("scsi(%ld): GA_NXT skipping *NON* Nx_Port - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid=%02x%02x%02x port_type=%x.\n", ++ ha->host_no, ++ ct_rsp->rsp.ga_nxt.node_name[0], ++ ct_rsp->rsp.ga_nxt.node_name[1], ++ ct_rsp->rsp.ga_nxt.node_name[2], ++ ct_rsp->rsp.ga_nxt.node_name[3], ++ ct_rsp->rsp.ga_nxt.node_name[4], ++ ct_rsp->rsp.ga_nxt.node_name[5], ++ ct_rsp->rsp.ga_nxt.node_name[6], ++ ct_rsp->rsp.ga_nxt.node_name[7], ++ ct_rsp->rsp.ga_nxt.port_name[0], ++ ct_rsp->rsp.ga_nxt.port_name[1], ++ ct_rsp->rsp.ga_nxt.port_name[2], ++ ct_rsp->rsp.ga_nxt.port_name[3], ++ ct_rsp->rsp.ga_nxt.port_name[4], ++ ct_rsp->rsp.ga_nxt.port_name[5], ++ ct_rsp->rsp.ga_nxt.port_name[6], ++ ct_rsp->rsp.ga_nxt.port_name[7], ++ ct_rsp->rsp.ga_nxt.port_id[0], ++ ct_rsp->rsp.ga_nxt.port_id[1], ++ ct_rsp->rsp.ga_nxt.port_id[2], ++ ct_rsp->rsp.ga_nxt.port_type)); ++ goto retry_ga_nxt; ++ } else { ++ /* Populate switch info entry. */ ++ swl_entry->d_id.b.domain = ct_rsp->rsp.ga_nxt.port_id[0]; ++ swl_entry->d_id.b.area = ct_rsp->rsp.ga_nxt.port_id[1]; ++ swl_entry->d_id.b.al_pa = ct_rsp->rsp.ga_nxt.port_id[2]; ++ ++ memcpy(swl_entry->node_name, ++ ct_rsp->rsp.ga_nxt.node_name, WWN_SIZE); ++ memcpy(swl_entry->port_name, ++ ct_rsp->rsp.ga_nxt.port_name, WWN_SIZE); ++ ++ swl_entry->type = SW_TYPE_SCSI; ++ if (ct_rsp->rsp.ga_nxt.fc4_types[3] & 0x20) ++ swl_entry->type |= SW_TYPE_IP; ++ ++ DEBUG2_3(printk("scsi(%ld): GA_NXT entry - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid=%02x%02x%02x type=%02x.\n", ++ ha->host_no, ++ swl_entry->node_name[0], swl_entry->node_name[1], ++ swl_entry->node_name[2], swl_entry->node_name[3], ++ swl_entry->node_name[4], swl_entry->node_name[5], ++ swl_entry->node_name[6], swl_entry->node_name[7], ++ swl_entry->port_name[0], swl_entry->port_name[1], ++ swl_entry->port_name[2], swl_entry->port_name[3], ++ swl_entry->port_name[4], swl_entry->port_name[5], ++ swl_entry->port_name[6], swl_entry->port_name[7], ++ swl_entry->d_id.b.domain, ++ swl_entry->d_id.b.area, ++ swl_entry->d_id.b.al_pa, ++ swl_entry->type)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * NOTE: Non-Nx_Ports are not requested. ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gid_pt(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ struct ct_sns_gid_pt_data *gid_data; ++ ++ ENTER(__func__); ++ ++ gid_data = NULL; ++ ++ /* Issue GID_PT */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, GID_PT_REQ_SIZE, GID_PT_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GID_PT_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GID_PT_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_type */ ++ ct_req->req.gid_pt.port_type = NS_NX_PORT_TYPE; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GID_PT issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, " ++ "gid_pt_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* Set port IDs in switch info list. */ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ memset(&list[i], 0, sizeof(sw_info_t)); ++ gid_data = &ct_rsp->rsp.gid_pt.entries[i]; ++ list[i].d_id.b.domain = gid_data->port_id[0]; ++ list[i].d_id.b.area = gid_data->port_id[1]; ++ list[i].d_id.b.al_pa = gid_data->port_id[2]; ++ ++ /* Last one exit. */ ++ if (gid_data->control_byte & BIT_7) { ++ list[i].d_id.b.rsvd_1 = gid_data->control_byte; ++ break; ++ } ++ } ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gpn_id() - SNS Get Port Name (GPN_ID) query. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gpn_id(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* Issue GPN_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, ++ GPN_ID_REQ_SIZE, GPN_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GPN_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GPN_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; ++ ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GPN_ID issue IOCB failed " ++ "(%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected " ++ "request, gpn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* Save portname */ ++ memcpy(list[i].port_name, ++ ct_rsp->rsp.gpn_id.port_name, WWN_SIZE); ++ } ++ ++ /* Last device exit. */ ++ if (list[i].d_id.b.rsvd_1 != 0) ++ break; ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gnn_id() - SNS Get Node Name (GPN_ID) query. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gnn_id(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* Issue GNN_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, ++ GNN_ID_REQ_SIZE, GNN_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GNN_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GNN_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; ++ ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GNN_ID issue IOCB failed " ++ "(%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected " ++ "request, gnn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* Save nodename */ ++ memcpy(list[i].node_name, ++ ct_rsp->rsp.gnn_id.node_name, WWN_SIZE); ++ } ++ ++ /* Last device exit. */ ++ if (list[i].d_id.b.rsvd_1 != 0) ++ break; ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gft_id() - SNS Get FC-4 TYPEs (GFT_ID) query. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gft_id(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* Issue GFT_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, ++ GFT_ID_REQ_SIZE, GFT_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GFT_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GFT_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; ++ ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GFT_ID issue IOCB failed " ++ "(%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GFT_ID failed, rejected " ++ "request, gft_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* FCP-3 check necessary? No, assume FCP-3 */ ++ /*if (ct_rsp->rsp.gft_id.fc4_types[2] & 0x01)*/ ++ list[i].type = SW_TYPE_SCSI; ++ if (ct_rsp->rsp.gft_id.fc4_types[3] & 0x20) ++ list[i].type |= SW_TYPE_IP; ++ ++ DEBUG2_3(printk("scsi(%ld): GID_PT entry - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid=%02x%02x%02x type=%02x.\n", ++ ha->host_no, ++ list[i].node_name[0], list[i].node_name[1], ++ list[i].node_name[2], list[i].node_name[3], ++ list[i].node_name[4], list[i].node_name[5], ++ list[i].node_name[6], list[i].node_name[7], ++ list[i].port_name[0], list[i].port_name[1], ++ list[i].port_name[2], list[i].port_name[3], ++ list[i].port_name[4], list[i].port_name[5], ++ list[i].port_name[6], list[i].port_name[7], ++ list[i].d_id.b.domain, ++ list[i].d_id.b.area, ++ list[i].d_id.b.al_pa, ++ list[i].type)); ++ } ++ ++ /* Last device exit. */ ++ if (list[i].d_id.b.rsvd_1 != 0) ++ break; ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rft_id(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RFT_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, RFT_ID_REQ_SIZE, RFT_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RFT_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RFT_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id, FC-4 types */ ++ ct_req->req.rft_id.port_id[0] = ha->d_id.b.domain; ++ ct_req->req.rft_id.port_id[1] = ha->d_id.b.area; ++ ct_req->req.rft_id.port_id[2] = ha->d_id.b.al_pa; ++ ++ ct_req->req.rft_id.fc4_types[2] = 0x01; /* FCP-3 */ ++ ha->active_fc4_types = EXT_DEF_FC4_TYPE_SCSI; ++ ++#if defined(FC_IP_SUPPORT) ++ if (ha->flags.enable_ip) { ++ ct_req->req.rft_id.fc4_types[3] = 0x20; /* IP over FC */ ++ ha->active_fc4_types |= EXT_DEF_FC4_TYPE_IP; ++ } ++#endif ++#if defined(FC_VI_SUPPORT) ++ ct_req->req.rft_id.fc4_types[8] = 0x01; /* FC-VI */ ++ ha->active_fc4_types |= EXT_DEF_FC4_TYPE_VI; ++#endif ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RFT_ID issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected " ++ "request, rft_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rff_id() - SNS Register FC-4 Features (RFF_ID) supported by the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rff_id(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RFF_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, RFF_ID_REQ_SIZE, RFF_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RFF_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RFF_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id, FC-4 feature, FC-4 type */ ++ ct_req->req.rff_id.port_id[0] = ha->d_id.b.domain; ++ ct_req->req.rff_id.port_id[1] = ha->d_id.b.area; ++ ct_req->req.rff_id.port_id[2] = ha->d_id.b.al_pa; ++ ++ if (!ha->flags.enable_target_mode) ++ ct_req->req.rff_id.fc4_feature = 0x02; /* SCSI Initiator */ ++ ++ ct_req->req.rff_id.fc4_type = 0x08; /* SCSI - FCP */ ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RFF_ID issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RFF_ID failed, rejected " ++ "request, rff_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RFF_ID exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rnn_id(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RNN_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, RNN_ID_REQ_SIZE, RNN_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RNN_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RNN_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id, node_name */ ++ ct_req->req.rnn_id.port_id[0] = ha->d_id.b.domain; ++ ct_req->req.rnn_id.port_id[1] = ha->d_id.b.area; ++ ct_req->req.rnn_id.port_id[2] = ha->d_id.b.al_pa; ++ ++ memcpy(ct_req->req.rnn_id.node_name, ha->init_cb->node_name, WWN_SIZE); ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RNN_ID issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected " ++ "request, rnn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rsnn_nn() - SNS Register Symbolic Node Name (RSNN_NN) of the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rsnn_nn(scsi_qla_host_t *ha) ++{ ++ int rval; ++ uint8_t *snn; ++ uint8_t version[20]; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RSNN_NN */ ++ /* Prepare common MS IOCB */ ++ /* Request size adjusted after CT preparation */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, 0, RSNN_NN_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RSNN_NN_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RSNN_NN_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- node_name, symbolic node_name, size */ ++ memcpy(ct_req->req.rsnn_nn.node_name, ha->init_cb->node_name, WWN_SIZE); ++ ++ /* Prepare the Symbolic Node Name */ ++ /* Board type */ ++ snn = ct_req->req.rsnn_nn.sym_node_name; ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID) { ++ switch (ha->pdev->subsystem_device) { ++ case 0x0100: ++ strcpy(snn , "QLA2340"); ++ break; ++ ++ case 0x0101: ++ strcpy(snn , "QLA2342"); ++ break; ++ ++ case 0x0102: ++ strcpy(snn , "QLA2312"); ++ break; ++ ++ default: ++ strcpy(snn , "QLA2312"); ++ break; ++ } ++ } else { ++ strcpy(snn ,"QLA23xx"); ++ } ++#else ++ sprintf(snn, "QLA%04x", ha->pdev->device); ++#endif ++ ++ /* Firmware version */ ++ strcat(snn, " FW:v"); ++ sprintf(version, "%d.%02d.%02d", ha->fw_major_version, ++ ha->fw_minor_version, ha->fw_subminor_version); ++ strcat(snn, version); ++ ++ /* Driver version */ ++ strcat(snn, " DVR:v"); ++ strcat(snn, qla2x00_version_str); ++ ++ /* Calculate SNN length */ ++ ct_req->req.rsnn_nn.name_len = (uint8_t)strlen(snn); ++ ++ /* Update MS IOCB request */ ++ ms_pkt->req_bytecount = ++ cpu_to_le32(24 + 1 + ct_req->req.rsnn_nn.name_len); ++ ms_pkt->dseg_req_length = ms_pkt->req_bytecount; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RSNN_NN issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RSNN_NN failed, rejected " ++ "request, rsnn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RSNN_NN exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++static int ++qla2x00_add_initiator_device(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ int ret; ++ fc_initiator_t *fcinitiator; ++ ++ ret = 1; ++ fcinitiator = kmalloc(sizeof(fc_initiator_t), GFP_ATOMIC); ++ if (fcinitiator != NULL) { ++ /* Setup initiator structure. */ ++ memset(fcinitiator, 0, sizeof(fc_initiator_t)); ++ ++ memcpy(fcinitiator->node_name, device->name, WWN_SIZE); ++ memcpy(fcinitiator->port_name, device->wwn, WWN_SIZE); ++ fcinitiator->d_id.b24 = device->d_id.b24; ++ fcinitiator->loop_id = device->loop_id; ++ list_add_tail(&fcinitiator->list, &ha->fcinitiators); ++ ret = 0; ++ } else { ++ printk(KERN_WARNING ++ "%s(): Memory Allocation failed - FCINITIATOR\n", ++ __func__); ++ } ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_restart_queues ++ * Restart device queues. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ */ ++void ++qla2x00_restart_queues(scsi_qla_host_t *ha, uint8_t flush) ++{ ++ srb_t *sp; ++ int retry_q_cnt = 0; ++ int pending_q_cnt = 0; ++ struct list_head *list, *temp; ++ unsigned long flags = 0; ++ struct list_head *hal; ++ scsi_qla_host_t *vis_ha; ++ ++ ++ ENTER(__func__); ++ ++ clear_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags); ++ ++ /* ++ * start pending queue ++ */ ++ pending_q_cnt = ha->qthreads; ++ if (flush) { ++ spin_lock_irqsave(&ha->list_lock,flags); ++ list_for_each_safe(list, temp, &ha->pending_queue) { ++ sp = list_entry(list, srb_t, list); ++ /* ++ * When time expire return request back to OS as BUSY ++ */ ++ __del_from_pending_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *)NULL; ++ __add_to_done_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ } else { ++ if (!list_empty(&ha->pending_queue)) ++ qla2x00_next(ha); ++ } ++ ++ /* ++ * Clear out our retry queue ++ */ ++ if (flush) { ++ spin_lock_irqsave(&ha->list_lock, flags); ++ retry_q_cnt = ha->retry_q_cnt; ++ list_for_each_safe(list, temp, &ha->retry_queue) { ++ sp = list_entry(list, srb_t, list); ++ /* when time expire return request back to OS as BUSY */ ++ __del_from_retry_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ DEBUG2(printk("%s(%ld): callback %d commands.\n", ++ __func__, ++ ha->host_no, ++ retry_q_cnt);) ++ } ++ ++ DEBUG2(printk("%s(%ld): active=%ld, retry=%d, pending=%d, " ++ "done=%ld, failover=%d, scsi retry=%d commands.\n", ++ __func__, ++ ha->host_no, ++ ha->actthreads, ++ ha->retry_q_cnt, ++ pending_q_cnt, ++ ha->done_q_cnt, ++ ha->failover_cnt, ++ ha->scsi_retry_q_cnt);) ++ ++ if (ha->flags.failover_enabled) { ++ /* Try and start all visible adapters */ ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ vis_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (!list_empty(&vis_ha->pending_queue)) ++ qla2x00_next(vis_ha); ++ ++ DEBUG2(printk("host(%ld):Commands busy=%d " ++ "failed=%d\nin_recovery=%d " ++ "eh_active=%d\n ", ++ vis_ha->host_no, ++ vis_ha->host->host_busy, ++ vis_ha->host->host_failed, ++ vis_ha->host->in_recovery, ++ vis_ha->host->eh_active);) ++ } ++ read_unlock(&qla_hostlist_lock); ++ } ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_update_fc_database ++ * This routine updates the device data in the database. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * device = device data pointer. ++ * ++ * Returns: ++ * 0 = success, if device found or added to database. ++ * BIT_0 = error ++ * BIT_1 = database was full and device was not configured. ++ */ ++static uint8_t ++qla2x00_update_fc_database(scsi_qla_host_t *ha, ++ fcdev_t *device, uint8_t enable_slot_reuse) ++{ ++ int rval; ++ uint16_t cnt, i; ++ ++ DEBUG(printk("scsi(%ld): Found device - " ++ "nodename=%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "portname=%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "port Id=%02x%02x%02x, loop id=%04x\n", ++ ha->host_no, ++ device->name[0], device->name[1], ++ device->name[2], device->name[3], ++ device->name[4], device->name[5], ++ device->name[6], device->name[7], ++ device->wwn[0], device->wwn[1], ++ device->wwn[2], device->wwn[3], ++ device->wwn[4], device->wwn[5], ++ device->wwn[6], device->wwn[7], ++ device->d_id.b.domain, device->d_id.b.area, device->d_id.b.al_pa, ++ device->loop_id)); ++ ++ /* Look for device in database. */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (ha->fc_db[cnt].loop_id == PORT_UNUSED) ++ continue; ++ ++ rval = 1; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(device->wwn, ++ ha->fc_db[cnt].wwn, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (device->d_id.b24 != ha->fc_db[cnt].d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(device->name, ++ ha->fc_db[cnt].name, WWN_SIZE); ++ break; ++ } ++ if (rval) ++ continue; ++ ++ DEBUG(printk("scsi(%ld): Reusing slot %d for device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->host_no, cnt, ++ device->wwn[0], ++ device->wwn[1], ++ device->wwn[2], ++ device->wwn[3], ++ device->wwn[4], ++ device->wwn[5], ++ device->wwn[6], ++ device->wwn[7])); ++ ++ if (device->flag & DEV_PUBLIC) { ++ ha->fc_db[cnt].flag |= DEV_PUBLIC; ++ } else { ++ if (ha->fc_db[cnt].flag & DEV_PUBLIC) { ++ ha->fc_db[cnt].flag &= ~DEV_PUBLIC; ++ ha->fabricid[ha->fc_db[cnt].loop_id].in_use ++ = FALSE; ++ } ++ } ++ ++ ha->fc_db[cnt].loop_id = device->loop_id; ++ ha->fc_db[cnt].d_id.b24 = device->d_id.b24; ++ ++ /* Update volatile unbound fields for PortID binding only */ ++ if (ha->binding_type == BIND_BY_PORT_ID) { ++ memcpy(ha->fc_db[cnt].name, device->name, WWN_SIZE); ++ memcpy(ha->fc_db[cnt].wwn, device->wwn, WWN_SIZE); ++ } ++ ++ return (0); ++ } ++ ++ /* Find a empty slot and add device into database. */ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ ++/* FlexServ Patch */ ++#if QLA2XXX_HOTSWAP_ENUMERATION ++ /* ++ * Enumerate upon the actual ID so add-single-device works ++ */ ++ if (i != device->loop_id) { ++ continue; ++ } ++#endif ++ ++ if ((ha->fc_db[i].loop_id == PORT_UNUSED) || ++ (ha->fc_db[i].loop_id == PORT_NEED_MAP)) { ++ ++ DEBUG(printk("scsi(%ld): New slot %d for device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->host_no, i, ++ device->wwn[0], ++ device->wwn[1], ++ device->wwn[2], ++ device->wwn[3], ++ device->wwn[4], ++ device->wwn[5], ++ device->wwn[6], ++ device->wwn[7])); ++ ++ memcpy(ha->fc_db[i].name, device->name, WWN_SIZE); ++ memcpy(ha->fc_db[i].wwn, device->wwn, WWN_SIZE); ++ ha->fc_db[i].loop_id = device->loop_id; ++ ha->fc_db[i].d_id.b24 = device->d_id.b24; ++ ++ if (device->flag & DEV_PUBLIC) ++ ha->fc_db[i].flag |= DEV_PUBLIC; ++ ++ ha->flags.updated_fc_db = TRUE; ++ ++ return (0); ++ } ++ } ++ ++ if (enable_slot_reuse) { ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ if (ha->fc_db[i].loop_id == PORT_AVAILABLE) { ++ DEBUG(printk("scsi(%ld): Assigned slot %d " ++ "reuse for device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->host_no, i, ++ device->wwn[0], ++ device->wwn[1], ++ device->wwn[2], ++ device->wwn[3], ++ device->wwn[4], ++ device->wwn[5], ++ device->wwn[6], ++ device->wwn[7])); ++ ++ memcpy(ha->fc_db[i].name, ++ device->name, WWN_SIZE); ++ memcpy(ha->fc_db[i].wwn, ++ device->wwn, WWN_SIZE); ++ ha->fc_db[i].loop_id = device->loop_id; ++ ha->fc_db[i].d_id.b24 = device->d_id.b24; ++ ++ if (device->flag & DEV_PUBLIC) ++ ha->fc_db[i].flag |= DEV_PUBLIC; ++ ++ ha->flags.updated_fc_db = TRUE; ++ ++ return (0); ++ } ++ } ++ } ++ ++ return(BIT_1); ++} ++ ++/* ++ * qla2x00_build_fcport_list ++ * Updates device on list. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = port structure pointer. ++ * ++ * Return: ++ * 0 - Success ++ * BIT_0 - error ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_build_fcport_list(scsi_qla_host_t *ha) ++{ ++// FIXME: FIX THIS C*!P!!! ++ int rval; ++ fcdev_t *dev; ++ int found = 0; ++ int cnt, i; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ ENTER(__func__); ++ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ dev = &ha->fc_db[cnt]; ++ ++ /* Skip if zero port name */ ++ if (qla2x00_is_wwn_zero(dev->wwn)) { ++ continue; ++ } ++ ++ DEBUG3(printk("scsi(%ld): found tgt %d in fc_db.\n", ++ ha->host_no, cnt)); ++ ++ /* Check for matching device in port list. */ ++ i = 0; ++ found = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ rval = 1; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(dev->wwn, ++ fcport->port_name, ++ WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (dev->d_id.b24 != ++ fcport->d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(dev->name, ++ fcport->node_name, ++ WWN_SIZE); ++ break; ++ } ++ if (rval) { ++ i++; ++ continue; ++ } ++ ++ /* ++ * Update volatile unbound fields for PortID binding ++ * only ++ */ ++ if (ha->binding_type == BIND_BY_PORT_ID) { ++ memcpy(fcport->node_name, dev->name, WWN_SIZE); ++ memcpy(fcport->port_name, dev->wwn, WWN_SIZE); ++ } ++ ++ DEBUG(printk("%s(): Found matching port %02x%02x%02x, " ++ "device flags= 0x%x\n", ++ __func__, ++ dev->d_id.b.domain, ++ dev->d_id.b.area, ++ dev->d_id.b.al_pa, ++ dev->flag);) ++ ++ /* if device found is missing then mark it */ ++ if (dev->flag & DEV_ABSENCE) { ++ DEBUG(printk("%s(): Port missing --- " ++ "(port_name) -> " ++ "%02x%02x%02x%02x%02x" ++ "%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = FC_NO_LOOP_ID; ++ ++ qla2x00_mark_device_lost(ha, fcport); ++ ++ found++; ++ break; ++ } ++ ++ /* if device was missing but returned */ ++ if (fcport->loop_id == FC_NO_LOOP_ID || ++ !(dev->flag & DEV_PUBLIC) || ++ atomic_read(&fcport->state) != FC_ONLINE) { ++ ++ DEBUG(printk("%s(): Port returned +++ " ++ "(port_name) -> " ++ "%02x%02x%02x%02x%02x" ++ "%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = dev->loop_id; ++ fcport->old_loop_id = dev->loop_id; ++ fcport->d_id.b24 = dev->d_id.b24; ++ ++ if (qla2x00_update_fcport(ha, fcport, cnt)) { ++ DEBUG2(printk("%s(%ld): update_fcport " ++ "failed.\n", ++ __func__, ++ ha->host_no);) ++ ++ return BIT_0; ++ } ++ ++ found++; ++ break; ++ } ++ ++ DEBUG(printk("%s(): Match - fcport[%d] = fc_db[%d] " ++ "(ignored) -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ i, ++ cnt, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = dev->loop_id; ++ fcport->old_loop_id = dev->loop_id; ++ ++ found++; ++ break; ++ } ++ if (found) ++ continue; ++ ++ /* Add device to port list. */ ++ DEBUG3(printk("%s(%ld): adding new device to list.\n", ++ __func__, ++ ha->host_no);) ++ ++ fcport = kmalloc(sizeof(fc_port_t), GFP_ATOMIC); ++ if (fcport == NULL) ++ break; ++ ++ memset(fcport, 0, sizeof(fc_port_t)); ++ ++ INIT_LIST_HEAD(&fcport->fcluns); ++ ++ /* copy fields into fcport */ ++ memcpy(fcport->port_name, dev->wwn, WWN_SIZE); ++ memcpy(fcport->node_name, dev->name, WWN_SIZE); ++ ++ fcport->dev_id = cnt; ++ ++ if (dev->flag & DEV_ABSENCE) { ++ DEBUG(printk("%s(): Port missing --- " ++ "(port_name) -> " ++ "%02x%02x%02x%02x" ++ "%02x%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = FC_NO_LOOP_ID; ++ ++ qla2x00_mark_device_lost(ha, fcport); ++ } else { ++ fcport->loop_id = dev->loop_id; ++ fcport->old_loop_id = dev->loop_id; ++ } ++ ++ fcport->d_id.b24 = dev->d_id.b24; ++ ++ DEBUG(printk("%s(): New Device +++ (port_name) -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ /* flags */ ++ if (dev->flag & DEV_PUBLIC) ++ fcport->flags |= FC_FABRIC_DEVICE; ++ ++ if (dev->flag & DEV_INITIATOR) ++ fcport->flags |= FC_INITIATOR_DEVICE; ++ ++ /* Assume the device supports RLC */ ++ fcport->flags |= FC_SUPPORT_RPT_LUNS; ++ ++ if (!ha->flags.failover_enabled) ++ qla2x00_get_lun_mask_from_config(ha, fcport, cnt, 0); ++ ++ /* Add to our list */ ++ list_add_tail(&fcport->list, &ha->fcports); ++ ++ if (qla2x00_update_fcport(ha, fcport, cnt)) { ++ DEBUG2(printk("%s(%ld): update_fcport failed.\n", ++ __func__, ++ ha->host_no);) ++ ++ return BIT_0; ++ } ++ } ++ ++ LEAVE(__func__); ++ ++ return (0); ++} ++ ++/* ++ * qla2x00_config_os ++ * Setup OS target and LUN structures. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_config_os(scsi_qla_host_t *ha) ++{ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ struct list_head *fcll; ++ fc_lun_t *fclun; ++ os_lun_t *lq; ++ uint16_t t, l; ++ ++ ++ DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* Allocate target */ ++#if 0 ++ if (fcport->loop_id == FC_NO_LOOP_ID) ++ continue; ++#endif ++ ++ /* Bind fcport to target number. */ ++ DEBUG5(printk("%s(%ld): fcport bind= %p\n", ++ __func__, ++ ha->host_no, fcport);) ++ ++ if ((t = qla2x00_fcport_bind(ha, fcport)) == MAX_TARGETS) ++ continue; ++ ++#if VSA ++ if ((ha->fc_db[t].flag & DEV_FLAG_VSA)) ++ fcport->flags |= FC_VSA; ++#endif ++ DEBUG5(printk("%s(%ld): going to alloc lun for tgt %d. mask=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ++ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ++ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ++ ".\n", ++ __func__, ++ ha->host_no, ++ t, ++ fcport->lun_mask.mask[0], ++ fcport->lun_mask.mask[1], ++ fcport->lun_mask.mask[2], ++ fcport->lun_mask.mask[3], ++ fcport->lun_mask.mask[4], ++ fcport->lun_mask.mask[5], ++ fcport->lun_mask.mask[6], ++ fcport->lun_mask.mask[7], ++ fcport->lun_mask.mask[8], ++ fcport->lun_mask.mask[9], ++ fcport->lun_mask.mask[10], ++ fcport->lun_mask.mask[11], ++ fcport->lun_mask.mask[12], ++ fcport->lun_mask.mask[13], ++ fcport->lun_mask.mask[14], ++ fcport->lun_mask.mask[15], ++ fcport->lun_mask.mask[16], ++ fcport->lun_mask.mask[17], ++ fcport->lun_mask.mask[18], ++ fcport->lun_mask.mask[19], ++ fcport->lun_mask.mask[20], ++ fcport->lun_mask.mask[21], ++ fcport->lun_mask.mask[22], ++ fcport->lun_mask.mask[23], ++ fcport->lun_mask.mask[24], ++ fcport->lun_mask.mask[25], ++ fcport->lun_mask.mask[26], ++ fcport->lun_mask.mask[27], ++ fcport->lun_mask.mask[28], ++ fcport->lun_mask.mask[29], ++ fcport->lun_mask.mask[30], ++ fcport->lun_mask.mask[31]);) ++ ++ /* Allocate LUNs */ ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ l = fclun->lun; /* Must not exceed MAX_LUN */ ++ ++ /* ++ * Always alloc LUN 0 so kernel will scan past LUN 0. ++ */ ++ if (l != 0 && ++ (EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), l))) { ++ ++ /* mask this LUN */ ++ continue; ++ } ++ ++ if ((lq = qla2x00_lun_alloc(ha, t, l)) == NULL) ++ continue; ++ ++ lq->fclun = fclun; ++ } ++ } ++ ++ DEBUG3(printk("%s(%ld): exiting normally.\n", __func__, ha->host_no);) ++} ++ ++/* ++ * qla2x00_fcport_bind ++ * Locates a target number for FC port. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * fcport = FC port structure pointer. ++ * ++ * Returns: ++ * target number ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint16_t ++qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ int rval; ++ uint16_t t; ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ /* Check for tgt already allocated for persistent binding. */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ if ((tq = TGT_Q(ha, t)) == NULL) ++ continue; ++ ++ rval = 0; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(fcport->port_name, ++ tq->port_name, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (fcport->d_id.b24 != tq->d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(fcport->node_name, ++ tq->node_name, WWN_SIZE); ++ break; ++ } ++ /* Found a persistently bound match */ ++ if (rval == 0) ++ break; ++ } ++ ++ if (fcport->loop_id == FC_NO_LOOP_ID) { ++ DEBUG(tq = TGT_Q(ha, t);) ++ DEBUG(printk("scsi%ld: Missing target ID %02x @ %p to " ++ "loop id: %04x, port state=0x%x, " ++ "port down retry=%d\n", ++ ha->host_no, ++ t, ++ tq, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ atomic_read(&fcport->port_down_timer));) ++ return (MAX_TARGETS); ++ } ++ ++ if (t != MAX_TARGETS) { ++ tq = TGT_Q(ha, t); ++ tq->vis_port = fcport; ++ ++ DEBUG(printk("scsi%ld: Assigning target ID %02x @ %p to " ++ "loop id: %04x, port state=0x%x, " ++ "port down retry=%d\n", ++ ha->host_no, ++ t, ++ tq, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ atomic_read(&fcport->port_down_timer));) ++ return (t); ++ } ++ ++ /* Check for persistent binding not yet configured. */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ rval = 0; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(fcport->port_name, ++ ha->fc_db[t].wwn, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (fcport->d_id.b24 != ++ ha->fc_db[t].d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(fcport->node_name, ++ ha->fc_db[t].name, WWN_SIZE); ++ break; ++ } ++ /* Found not-yet-allocated target at t */ ++ if (rval == 0) ++ break; ++ } ++ ++ if (t == MAX_TARGETS) { ++ /* Check if slot at loop ID is available. */ ++ t = fcport->loop_id; ++ if (TGT_Q(ha, t) != NULL) { ++ /* Locate first free target id in db for device. */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ if (TGT_Q(ha, t) == NULL) ++ break; ++ } ++ } ++ } ++ ++ if (t != MAX_TARGETS) { ++ tq = qla2x00_tgt_alloc(ha, t); ++ if (tq != NULL) { ++ memcpy(tq->port_name, fcport->port_name, WWN_SIZE); ++ tq->d_id.b24 = fcport->d_id.b24; ++ memcpy(tq->node_name, fcport->node_name, WWN_SIZE); ++ } ++ else ++ t = MAX_TARGETS; ++ } ++ ++ if (t == MAX_TARGETS) { ++ DEBUG2(printk("%s(): **** FAILED ****", __func__);) ++ printk(KERN_WARNING ++ "%s(): **** FAILED ****", __func__); ++ } else { ++ if (!ha->flags.failover_enabled) { ++ /* fcport IS the visible port in non-failover mode */ ++ tq = TGT_Q(ha, t); ++ tq->vis_port = fcport; ++ } ++ ++ DEBUG(tq = TGT_Q(ha, t);) ++ DEBUG(printk("scsi%ld: Assigning target ID %02x @ %p to " ++ "loop id: %04x, port state=0x%x, " ++ "port down retry=%d\n", ++ ha->host_no, ++ t, ++ tq, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ atomic_read(&fcport->port_down_timer));) ++ } ++ ++ LEAVE(__func__); ++ ++ return (t); ++} ++ ++/* ++ * qla2x00_update_fcport ++ * Updates device on list. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = port structure pointer. ++ * ++ * Return: ++ * 0 - Success ++ * BIT_0 - error ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int index) ++{ ++ DEBUG4(printk("%s(): entered, loop_id = %d\n", ++ __func__, ++ fcport->loop_id);) ++ ++ fcport->port_login_retry_count = ++ ha->port_down_retry_count * PORT_RETRY_TIME; ++ atomic_set(&fcport->state, FC_ONLINE); ++ fcport->login_retry = 0; ++ fcport->ha = ha; ++ atomic_set(&fcport->port_down_timer, ++ ha->port_down_retry_count * PORT_RETRY_TIME); ++ ++ /* Do LUN discovery. */ ++ return (qla2x00_lun_discovery(ha, fcport, index)); ++} ++ ++/* ++ * qla2x00_lun_discovery ++ * Issue SCSI inquiry command for LUN discovery. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = FC port structure pointer. ++ * ++ * Return: ++ * 0 - Success ++ * BIT_0 - error ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int index) ++{ ++ inq_cmd_rsp_t *pkt; ++ int rval; ++ uint16_t lun; ++ struct list_head *fcll; ++ fc_lun_t *fclun; ++ int found; ++ dma_addr_t phys_address = 0; ++ int disconnected; ++ int retry; ++ fcdev_t dev; ++ int rlc_succeeded; ++ uint16_t comp_status; ++ uint16_t scsi_status; ++ ++ ENTER(__func__); ++ ++ /* ++ * Immediately issue a RLC to the fcport ++ */ ++ rlc_succeeded = 0; ++ if (qla2x00_rpt_lun_discovery(ha, fcport) == QLA2X00_SUCCESS) { ++ /* ++ * We always need at least LUN 0 to be present in our fclun ++ * list if RLC succeeds. ++ */ ++ qla2x00_cfg_lun(fcport, 0); ++ /* ++ * At least do an inquiry on LUN 0 to determine peripheral ++ * qualifier type. ++ */ ++ rlc_succeeded = 1; ++ } ++ ++ /* ++ * RLC failed for some reason, try basic inquiries ++ */ ++ pkt = pci_alloc_consistent(ha->pdev, ++ sizeof(inq_cmd_rsp_t), &phys_address); ++ if (pkt == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - INQ\n", ++ ha->host_no); ++ ++ ha->mem_err++; ++ return BIT_0; ++ } ++ ++ for (lun = 0; lun < ha->max_probe_luns; lun++) { ++ retry = 2; ++ do { ++ memset(pkt, 0, sizeof(inq_cmd_rsp_t)); ++ pkt->p.cmd.entry_type = COMMAND_A64_TYPE; ++ pkt->p.cmd.entry_count = 1; ++ pkt->p.cmd.lun = cpu_to_le16(lun); ++#if defined(EXTENDED_IDS) ++ pkt->p.cmd.target = cpu_to_le16(fcport->loop_id & 0xFF); ++#else ++ pkt->p.cmd.target = (uint8_t)fcport->loop_id; ++#endif ++ pkt->p.cmd.control_flags = ++ __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG); ++ pkt->p.cmd.scsi_cdb[0] = INQ_SCSI_OPCODE; ++ pkt->p.cmd.scsi_cdb[4] = INQ_DATA_SIZE; ++ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1); ++ pkt->p.cmd.timeout = __constant_cpu_to_le16(10); ++ pkt->p.cmd.byte_count = ++ __constant_cpu_to_le32(INQ_DATA_SIZE); ++ pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( ++ LSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( ++ MSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_length = ++ __constant_cpu_to_le32(INQ_DATA_SIZE); ++ ++ DEBUG5(printk("scsi(%ld): Lun Inquiry - fcport=%p," ++ " lun (%d)\n", ++ ha->host_no, fcport, lun)); ++ ++ rval = qla2x00_issue_iocb(ha, ++ pkt, phys_address, sizeof(inq_cmd_rsp_t)); ++ ++ comp_status = le16_to_cpu(pkt->p.rsp.comp_status); ++ scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); ++ ++ DEBUG5(printk("scsi(%ld): lun (%d) inquiry - " ++ "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x, " ++ "rval=%d\n", ++ ha->host_no, ++ lun, pkt->inq[0], ++ comp_status, scsi_status, rval)); ++ ++ /* if port not logged in then try and login */ ++ if (lun == 0 && comp_status == CS_PORT_LOGGED_OUT) { ++ memset(&dev, 0, sizeof (dev)); ++ dev.d_id.b24 = ha->fc_db[index].d_id.b24; ++ ++ /* login and update database */ ++ if (qla2x00_fabric_login(ha, &dev) == 0) ++ ha->fc_db[index].loop_id = dev.loop_id; ++ } ++ } while ((rval != QLA2X00_SUCCESS || ++ comp_status != CS_COMPLETE) && retry--); ++ ++ if (rval != QLA2X00_SUCCESS || ++ comp_status != CS_COMPLETE || ++ (scsi_status & SS_CHECK_CONDITION)) { ++ ++ DEBUG(printk("scsi(%ld): Failed lun inquiry - " ++ "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x. " ++ "loop_id=%d\n", ++ ha->host_no, ++ pkt->inq[0], ++ comp_status, scsi_status, ++ fcport->loop_id)); ++ ++ break; ++ } ++ ++ disconnected = 0; ++ ++ /* ++ * We only need to issue an inquiry on LUN 0 to determine the ++ * port's peripheral qualifier type ++ */ ++ if (rlc_succeeded == 1) { ++ if (pkt->inq[0] == 0 || pkt->inq[0] == 0xc) { ++ fcport->flags &= ~(FC_TAPE_DEVICE); ++ ha->fc_db[index].flag &= ~DEV_TAPE_DEVICE; ++ } else if (pkt->inq[0] == 1 || pkt->inq[0] == 8) { ++ fcport->flags |= FC_TAPE_DEVICE; ++ ha->fc_db[index].flag |= DEV_TAPE_DEVICE; ++ } ++ ++ /* Stop the scan */ ++ break; ++ } ++ ++ /* inq[0] ==: ++ * 0x0- Hard Disk. ++ * 0xc- is a processor device. ++ * 0x1- is a Tape Device. ++ * 0x8- is a medium changer device ++ * which is basically a Tape device. ++ */ ++ if (pkt->inq[0] == 0 || pkt->inq[0] == 0xc) { ++ fcport->flags &= ~(FC_TAPE_DEVICE); ++ ha->fc_db[index].flag &= ~DEV_TAPE_DEVICE; ++ } else if (pkt->inq[0] == 1 || pkt->inq[0] == 8) { ++ fcport->flags |= FC_TAPE_DEVICE; ++ ha->fc_db[index].flag |= DEV_TAPE_DEVICE; ++ } else if (pkt->inq[0] == 0x20 || pkt->inq[0] == 0x7f) { ++ disconnected++; ++ } else { ++ continue; ++ } ++ ++ /* Allocate LUN if not already allocated. */ ++ found = 0; ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ if (fclun->lun == lun) { ++ found++; ++ break; ++ } ++ } ++ if (found) ++ continue; ++ ++ /* Add this lun to our list */ ++ fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC); ++ if (fclun != NULL) { ++ fcport->lun_cnt++; ++ /* Setup LUN structure. */ ++ memset(fclun, 0, sizeof(fc_lun_t)); ++ ++ fclun->fcport = fcport; ++ fclun->lun = lun; ++ ++ if (disconnected) ++ fclun->flags |= FC_DISCON_LUN; ++ ++ list_add_tail(&fclun->list, &fcport->fcluns); ++ ++ DEBUG5(printk("scsi(%ld): Allocated fclun %p, lun=%d" ++ "disconnected=%d\n", ++ ha->host_no, ++ fclun, ++ fclun->lun, ++ disconnected)); ++ } else { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - fclun\n", ++ ha->host_no); ++ ++ ha->mem_err++; ++ pci_free_consistent(ha->pdev, ++ sizeof(inq_cmd_rsp_t), pkt, phys_address); ++ ++ return BIT_0; ++ } ++ ++ } ++ ++ DEBUG(printk("scsi(%ld): fcport lun count=%d, fcport= %p\n", ++ ha->host_no, fcport->lun_cnt, fcport)); ++ ++ pci_free_consistent(ha->pdev, sizeof(inq_cmd_rsp_t), pkt, phys_address); ++ ++ LEAVE(__func__); ++ ++ return 0; ++} ++ ++/* ++ * qla2x00_rpt_lun_discovery ++ * Issue SCSI report LUN command for LUN discovery. ++ * ++ * Input: ++ * ha: adapter state pointer. ++ * fcport: FC port structure pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ rpt_lun_cmd_rsp_t *pkt; ++ dma_addr_t phys_address = 0; ++ int rval; ++ uint32_t len, cnt; ++ uint8_t retries; ++ uint16_t lun; ++ uint16_t comp_status; ++ uint16_t scsi_status; ++ ++ ENTER(__func__); ++ ++ /* Assume a failed status */ ++ rval = QLA2X00_FAILED; ++ ++ /* No point in continuing if the device doesn't support RLC */ ++ if (!(fcport->flags & FC_SUPPORT_RPT_LUNS)) ++ return (rval); ++ ++ pkt = pci_alloc_consistent(ha->pdev, ++ sizeof(rpt_lun_cmd_rsp_t), &phys_address); ++ if (pkt == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - RLC", ++ ha->host_no); ++ ++ ha->mem_err++; ++ return BIT_0; ++ } ++ ++ for (retries = 4; retries; retries--) { ++ memset(pkt, 0, sizeof(rpt_lun_cmd_rsp_t)); ++ pkt->p.cmd.entry_type = COMMAND_A64_TYPE; ++ pkt->p.cmd.entry_count = 1; ++#if defined(EXTENDED_IDS) ++ pkt->p.cmd.target = cpu_to_le16(fcport->loop_id & 0xFF); ++#else ++ pkt->p.cmd.target = (uint8_t)fcport->loop_id; ++#endif ++ pkt->p.cmd.control_flags = ++ __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG); ++ pkt->p.cmd.scsi_cdb[0] = RPT_LUN_SCSI_OPCODE; ++ pkt->p.cmd.scsi_cdb[8] = MSB(sizeof(rpt_lun_lst_t)); ++ pkt->p.cmd.scsi_cdb[9] = LSB(sizeof(rpt_lun_lst_t)); ++ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1); ++ pkt->p.cmd.timeout = __constant_cpu_to_le16(10); ++ pkt->p.cmd.byte_count = ++ __constant_cpu_to_le32(sizeof(rpt_lun_lst_t)); ++ pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( ++ LSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( ++ MSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_length = ++ __constant_cpu_to_le32(sizeof(rpt_lun_lst_t)); ++ ++ rval = qla2x00_issue_iocb(ha, ++ pkt, phys_address, sizeof(rpt_lun_cmd_rsp_t)); ++ ++ comp_status = le16_to_cpu(pkt->p.rsp.comp_status); ++ scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); ++ ++ if (rval != QLA2X00_SUCCESS || ++ comp_status != CS_COMPLETE || ++ scsi_status & SS_CHECK_CONDITION) { ++ ++ /* Device underrun, treat as OK. */ ++ if (comp_status == CS_DATA_UNDERRUN && ++ scsi_status & SS_RESIDUAL_UNDER) { ++ ++ rval = QLA2X00_SUCCESS; ++ break; ++ } ++ ++ DEBUG(printk("scsi(%ld): RLC failed to issue iocb! " ++ "fcport = %p rval = %x cs = %x ss = %x\n", ++ ha->host_no, ++ fcport, ++ rval, comp_status, scsi_status)); ++ ++ rval = QLA2X00_FAILED; ++ if (scsi_status & SS_CHECK_CONDITION) { ++ DEBUG2(printk("scsi(%ld): RLC " ++ "SS_CHECK_CONDITION Sense Data " ++ "%02x %02x %02x %02x %02x %02x %02x %02x\n", ++ ha->host_no, ++ pkt->p.rsp.req_sense_data[0], ++ pkt->p.rsp.req_sense_data[1], ++ pkt->p.rsp.req_sense_data[2], ++ pkt->p.rsp.req_sense_data[3], ++ pkt->p.rsp.req_sense_data[4], ++ pkt->p.rsp.req_sense_data[5], ++ pkt->p.rsp.req_sense_data[6], ++ pkt->p.rsp.req_sense_data[7])); ++ /* No point in retrying if ILLEGAL REQUEST */ ++ if (pkt->p.rsp.req_sense_data[2] == ++ ILLEGAL_REQUEST) { ++ /* Clear RLC support flag */ ++ fcport->flags &= ~(FC_SUPPORT_RPT_LUNS); ++ break; ++ } ++ } ++ } else { ++ break; ++ } ++ } ++ ++ /* Test for report LUN failure. */ ++ if (rval == QLA2X00_SUCCESS) { ++ /* Configure LUN list. */ ++ len = be32_to_cpu(pkt->list.hdr.len); ++ len /= 8; ++ if (len == 0) { ++ rval = QLA2X00_FAILED; ++ } else { ++ for (cnt = 0; cnt < len; cnt++) { ++ lun = CHAR_TO_SHORT(pkt->list.lst[cnt].lsb, ++ pkt->list.lst[cnt].msb.b); ++ ++ DEBUG3(printk("scsi(%ld): RLC lun = (%d)\n", ++ ha->host_no, lun)); ++ ++ /* We only support 0 through MAX_LUNS-1 range */ ++ if (lun < MAX_LUNS) { ++ qla2x00_cfg_lun(fcport, lun); ++ } ++ } ++ rval = QLA2X00_SUCCESS; ++ } ++ } else { ++ rval = QLA2X00_FAILED; ++ } ++ ++ pci_free_consistent(ha->pdev, ++ sizeof(rpt_lun_cmd_rsp_t), pkt, phys_address); ++ ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_cfg_lun ++ * Configures LUN into fcport LUN list. ++ * ++ * Input: ++ * fcport: FC port structure pointer. ++ * lun: LUN number. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun) ++{ ++ int found; ++ struct list_head *fcll; ++ fc_lun_t *fclun; ++ ++ /* Allocate LUN if not already allocated. */ ++ found = 0; ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ if (fclun->lun == lun) { ++ found++; ++ break; ++ } ++ } ++ if (!found) { ++ fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC); ++ if (fclun != NULL) { ++ fcport->lun_cnt++; ++ /* Setup LUN structure. */ ++ memset(fclun, 0, sizeof(fc_lun_t)); ++ fclun->fcport = fcport; ++ fclun->lun = lun; ++ /* How dow we assign the following */ ++ /* fclun->state = FCS_ONLINE; */ ++ ++ list_add_tail(&fclun->list, &fcport->fcluns); ++ } else { ++ printk(KERN_WARNING ++ "%s(): Memory Allocation failed - FCLUN\n", ++ __func__); ++ } ++ } ++} ++ ++/* ++ * qla2x00_tgt_alloc ++ * Allocate and pre-initialize target queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * ++ * Returns: ++ * NULL = failure ++ * ++ * Context: ++ * Kernel context. ++ */ ++os_tgt_t * ++qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t t) ++{ ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate TGT queue and lock. ++ */ ++ if (t >= MAX_TARGETS) { ++ DEBUG2(printk("%s(%ld): *** Invalid target number, exiting ***", ++ __func__, ++ ha->host_no);) ++ return (NULL); ++ } ++ ++ tq = TGT_Q(ha, t); ++ if (tq == NULL) { ++ tq = kmalloc(sizeof(os_tgt_t), GFP_ATOMIC); ++ if (tq != NULL) { ++ DEBUG(printk("Alloc Target %d @ %p\n", t, tq);) ++ ++ memset(tq, 0, sizeof(os_tgt_t)); ++ tq->flags = TGT_TAGGED_QUEUE; ++ tq->ha = ha; ++ ++ TGT_Q(ha, t) = tq; ++ } ++ } ++ if (tq != NULL) { ++ tq->port_down_retry_count = ha->port_down_retry_count; ++ } else { ++ printk(KERN_WARNING ++ "%s(%ld): Failed to allocate target\n", ++ __func__, ++ ha->host_no); ++ ha->mem_err++; ++ } ++ ++ LEAVE(__func__); ++ ++ return (tq); ++} ++ ++/* ++ * qla2x00_tgt_free ++ * Frees target and LUN queues. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t) ++{ ++ os_tgt_t *tq; ++ uint16_t l; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate TGT queue and lock. ++ */ ++ if (t >= MAX_TARGETS) { ++ DEBUG2(printk("%s(): **** FAILED exiting ****", __func__);) ++ ++ return; ++ } ++ ++ tq = TGT_Q(ha, t); ++ if (tq != NULL) { ++ TGT_Q(ha, t) = NULL; ++ DEBUG(printk("Dealloc target @ %p -- deleted\n", tq);) ++ ++ /* Free LUN structures. */ ++ for (l = 0; l < MAX_LUNS; l++) ++ qla2x00_lun_free(ha, t, l); ++ ++ kfree(tq); ++ } ++ ++ LEAVE(__func__); ++ ++ return; ++} ++ ++/* ++ * qla2x00_lun_alloc ++ * Allocate and initialize LUN queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * l = LUN number. ++ * ++ * Returns: ++ * NULL = failure ++ * ++ * Context: ++ * Kernel context. ++ */ ++os_lun_t * ++qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t t, uint16_t l) ++{ ++ os_lun_t *lq; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate LUN queue. ++ */ ++ if (t >= MAX_TARGETS || ++ l >= MAX_LUNS || ++ TGT_Q(ha, t) == NULL) { ++ ++ DEBUG2(printk("%s(): tgt=%d, tgt_q= %p, lun=%d, " ++ "instance=%ld **** FAILED exiting ****\n", ++ __func__, ++ t, ++ TGT_Q(ha,t), ++ l, ++ ha->instance);) ++ ++ return (NULL); ++ } ++ ++ lq = LUN_Q(ha, t, l); ++ if (lq == NULL) { ++ lq = kmalloc(sizeof(os_lun_t), GFP_ATOMIC); ++ if (lq != NULL) { ++ ++ DEBUG5(printk("Alloc Lun %d @ %p \n",l,lq);) ++ ++ memset(lq, 0, sizeof (os_lun_t)); ++ LUN_Q(ha, t, l) = lq; ++ /* ++ * The following lun queue initialization code ++ * must be duplicated in alloc_ioctl_mem function ++ * for ioctl_lq. ++ */ ++ lq->q_state = LUN_STATE_READY; ++ spin_lock_init(&lq->q_lock); ++ } else { ++ /*EMPTY*/ ++ DEBUG2(printk("%s(): Failed to allocate lun %d ***\n", ++ __func__, ++ l);) ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - FCLUN\n", ++ ha->host_no); ++ ha->mem_err++; ++ } ++ } ++ ++ if (lq == NULL) { ++ DEBUG2(printk("%s(): **** FAILED exiting ****\n", __func__);) ++ } else { ++ LEAVE(__func__); ++ } ++ ++ return (lq); ++} ++ ++/* ++ * qla2x00_lun_free ++ * Frees LUN queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_lun_free(scsi_qla_host_t *ha, uint16_t t, uint16_t l) ++{ ++ os_lun_t *lq; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate TGT queue and lock. ++ */ ++ if (t >= MAX_TARGETS || l >= MAX_LUNS) { ++ DEBUG2(printk("%s(): **** FAILED exiting ****", __func__);) ++ ++ return; ++ } ++ ++ if (TGT_Q(ha, t) != NULL && ++ (lq = LUN_Q(ha, t, l)) != NULL) { ++ ++ LUN_Q(ha, t, l) = NULL; ++ kfree(lq); ++ ++ DEBUG3(printk("Dealloc lun @ %p -- deleted\n", lq);) ++ } ++ ++ LEAVE(__func__); ++ ++ return; ++} ++ ++ ++/* ++ * qla2x00_get_lun_mask_from_config ++ * Get lun mask from the configuration parameters. ++ * Bit order is little endian. ++ * ++ * Input: ++ * ha -- Host adapter ++ * tgt -- target/device number ++ * port -- pointer to port ++ */ ++static void ++qla2x00_get_lun_mask_from_config(scsi_qla_host_t *ha, ++ fc_port_t *port, uint16_t tgt, uint16_t dev_no) ++{ ++ char propbuf[60]; /* size of search string */ ++ int rval, lun, l; ++ lun_bit_mask_t lun_mask, *mask_ptr = &lun_mask; ++ ++ /* Get "target-N-device-N-lun-mask" as a 256 bit lun_mask*/ ++ sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled", ++ ha->instance, tgt, dev_no); ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, (uint8_t *)&lun_mask, ++ sizeof(lun_bit_mask_t)); ++ if (rval != -1 && ++ (rval == sizeof(lun_bit_mask_t))) { ++ ++ DEBUG3(printk("%s(%ld): lun mask for port %p from file:\n", ++ __func__, ++ ha->host_no, ++ port);) ++ DEBUG3(qla2x00_dump_buffer((uint8_t *)&port->lun_mask, ++ sizeof(lun_bit_mask_t));) ++ ++ for (lun = 8 * sizeof(lun_bit_mask_t) - 1, l = 0; ++ lun >= 0; ++ lun--, l++) { ++ ++ if (EXT_IS_LUN_BIT_SET(mask_ptr, lun)) ++ EXT_SET_LUN_BIT((&port->lun_mask),l); ++ else ++ EXT_CLR_LUN_BIT((&port->lun_mask),l); ++ } ++ ++ DEBUG3(printk("%s(%ld): returning lun mask for port " ++ "%02x%02x%02x%02x%02x%02x%02x%02x:\n", ++ __func__, ++ ha->host_no, ++ port->port_name[0], port->port_name[1], ++ port->port_name[2], port->port_name[3], ++ port->port_name[4], port->port_name[5], ++ port->port_name[6], port->port_name[7]);) ++ DEBUG3(qla2x00_dump_buffer((uint8_t *)&port->lun_mask, ++ sizeof(lun_bit_mask_t));) ++ } ++} ++ ++/* ++ * qla2x00_bstr_to_hex ++ * Convert hex byte string to number. ++ * ++ * Input: ++ * s = byte string pointer. ++ * bp = byte pointer for number. ++ * size = number of bytes. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ */ ++static int ++qla2x00_bstr_to_hex(char *s, uint8_t *bp, int size) ++{ ++ int cnt; ++ uint8_t n; ++ ++ ENTER(__func__); ++ ++ for (cnt = 0; *s != '\0' && cnt / 2 < size; cnt++) { ++ if (*s >= 'A' && *s <= 'F') { ++ n = (*s++ - 'A') + 10; ++ } else if (*s >= 'a' && *s <= 'f') { ++ n = (*s++ - 'a') + 10; ++ } else if (*s >= '0' && *s <= '9') { ++ n = *s++ - '0'; ++ } else { ++ cnt = 0; ++ break; ++ } ++ ++ if (cnt & BIT_0) ++ *bp++ |= n; ++ else ++ *bp = n << 4; ++ } ++ /* fixme(dg) Need to swap data little endian */ ++ ++ LEAVE(__func__); ++ ++ return (cnt / 2); ++} ++ ++/* ++ * qla2x00_get_prop_xstr ++ * Get a string property value for the specified property name and ++ * convert from the property string found in the configuration file, ++ * which are ASCII characters representing nibbles, 2 characters represent ++ * the hexdecimal value for a byte in the byte array. ++ * The byte array is initialized to zero. ++ * The resulting converted value is in big endian format (MSB at byte0). ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * propname = property name pointer. ++ * propval = pointer where to store converted property val. ++ * size = max or expected size of 'propval' array. ++ * ++ * Returns: ++ * 0 = empty value string or invalid character in string ++ * >0 = count of characters converted ++ * -1 = property not found ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_prop_xstr(scsi_qla_host_t *ha, ++ char *propname, uint8_t *propval, int size) ++{ ++ char *propstr; ++ int rval = -1; ++ static char buf[LINESIZE]; ++ ++ ENTER(__func__); ++ ++ /* Get the requested property string */ ++ rval = qla2x00_find_propname(ha, propname, buf, ha->cmdline, size*2); ++ DEBUG3(printk("%s(): Ret rval from find propname = %d\n", ++ __func__, ++ rval);) ++ ++ propstr = &buf[0]; ++ if (*propstr == '=') ++ propstr++; /* ignore equal sign */ ++ ++ if (rval == 0) { /* not found */ ++ LEAVE(__func__); ++ return (-1); ++ } ++ ++ rval = qla2x00_bstr_to_hex(propstr, (uint8_t *)propval, size); ++ if (rval == 0) { ++ /* Invalid character in value string */ ++ printk(KERN_INFO ++ "%s(): %s Invalid hex string for property\n", ++ __func__, ++ propname); ++ printk(KERN_INFO ++ " Invalid string - %s\n", ++ propstr); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_find_propname ++ * Get property in database. ++ * ++ * Input: ++ * ha = adapter structure pointer. ++ * db = pointer to database ++ * propstr = pointer to dest array for string ++ * propname = name of property to search for. ++ * siz = size of property ++ * ++ * Returns: ++ * 0 = no property ++ * size = index of property ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_find_propname(scsi_qla_host_t *ha, ++ char *propname, char *propstr, ++ char *db, int siz) ++{ ++ char *cp; ++ ++ /* find the specified string */ ++ if (db) { ++ /* find the property name */ ++ if ((cp = strstr(db,propname)) != NULL) { ++ while ((*cp) && *cp != '=') ++ cp++; ++ if (*cp) { ++ strncpy(propstr, cp, siz+1); ++ propstr[siz+1] = '\0'; ++ DEBUG(printk("qla2x00_find_propname: found " ++ "property = {%s}\n", ++ propstr);) ++ return (siz); /* match */ ++ } ++ } ++ } ++ ++ return (0); ++} ++ ++ ++/* ++ * qla2x00_get_prop_16chars ++ * Get an 8-byte property value for the specified property name by ++ * converting from the property string found in the configuration file. ++ * The resulting converted value is in big endian format (MSB at byte0). ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * propname = property name pointer. ++ * propval = pointer to location for the converted property val. ++ * db = pointer to database ++ * ++ * Returns: ++ * 0 = value returned successfully. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_prop_16chars(scsi_qla_host_t *ha, ++ char *propname, char *propval, char *db) ++{ ++ char *propstr; ++ int i, k; ++ int rval; ++ uint8_t nval; ++ uint8_t *pchar; ++ uint8_t *ret_byte; ++ uint8_t *tmp_byte; ++ uint8_t *retval = (uint8_t*)propval; ++ uint8_t tmpval[8] = {0, 0, 0, 0, 0, 0, 0, 0}; ++ uint16_t max_byte_cnt = 8; /* 16 chars = 8 bytes */ ++ uint16_t max_strlen = 16; ++ static char buf[LINESIZE]; ++ ++ rval = qla2x00_find_propname(ha, propname, buf, db, max_strlen); ++ ++ propstr = &buf[0]; ++ if (*propstr == '=') ++ propstr++; /* ignore equal sign */ ++ ++ if (rval == 0) { ++ return (1); ++ } ++ ++ /* Convert string to numbers. */ ++ pchar = (uint8_t *)propstr; ++ tmp_byte = (uint8_t *)tmpval; ++ ++ rval = 0; ++ for (i = 0; i < max_strlen; i++) { ++ /* ++ * Check for invalid character, two at a time, ++ * then convert them starting with first byte. ++ */ ++ ++ if ((pchar[i] >= '0') && (pchar[i] <= '9')) { ++ nval = pchar[i] - '0'; ++ } else if ((pchar[i] >= 'A') && (pchar[i] <= 'F')) { ++ nval = pchar[i] - 'A' + 10; ++ } else if ((pchar[i] >= 'a') && (pchar[i] <= 'f')) { ++ nval = pchar[i] - 'a' + 10; ++ } else { ++ /* invalid character */ ++ rval = 1; ++ break; ++ } ++ ++ if (i & BIT_0) { ++ *tmp_byte = *tmp_byte | nval; ++ tmp_byte++; ++ } else { ++ *tmp_byte = *tmp_byte | nval << 4; ++ } ++ } ++ ++ if (rval != 0) { ++ /* Encountered invalid character. */ ++ return (rval); ++ } ++ ++ /* Copy over the converted value. */ ++ ret_byte = retval; ++ tmp_byte = tmpval; ++ ++ i = max_byte_cnt; ++ k = 0; ++ while (i--) { ++ *ret_byte++ = *tmp_byte++; ++ } ++ ++ /* big endian retval[0]; */ ++ return (0); ++} ++ ++/* ++* qla2x00_get_properties ++* Find all properties for the specified adapeter in ++* command line. ++* ++* Input: ++* ha = adapter block pointer. ++* cmdline = pointer to command line string ++* ++* Context: ++* Kernel context. ++*/ ++static void ++qla2x00_get_properties(scsi_qla_host_t *ha, char *cmdline) ++{ ++ static char propbuf[LINESIZE]; ++ uint8_t tmp_name[8]; ++ ++ /* Adapter FC node names. */ ++ sprintf(propbuf, "scsi-qla%d-adapter-node", (int) ha->instance); ++ qla2x00_get_prop_16chars (ha, ++ propbuf, ++ (uint8_t *)(&ha->init_cb->node_name), ++ cmdline); ++ ++ sprintf(propbuf, "scsi-qla%d-adapter-port", (int) ha->instance); ++ ++ /* DG 04/07 check portname of adapter */ ++ qla2x00_get_prop_16chars (ha, ++ propbuf, ++ tmp_name, ++ cmdline); ++ if (memcmp(ha->init_cb->port_name, tmp_name, 8) != 0) { ++ /* ++ * Adapter port name is WWN, and cannot be changed. ++ * Inform users of the mismatch, then just continue driver ++ * loading using the original adapter port name in NVRAM. ++ */ ++ printk(KERN_WARNING ++ "qla2x00: qla%ld found mismatch in " ++ "adapter port names.\n", ++ ha->instance); ++ printk(KERN_INFO ++ " qla%ld port name found in NVRAM " ++ "-> %02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->instance, ++ ha->init_cb->port_name[0], ++ ha->init_cb->port_name[1], ++ ha->init_cb->port_name[2], ++ ha->init_cb->port_name[3], ++ ha->init_cb->port_name[4], ++ ha->init_cb->port_name[5], ++ ha->init_cb->port_name[6], ++ ha->init_cb->port_name[7]); ++ printk(KERN_INFO ++ " qla%ld port name found on command line " ++ "-> %02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->instance, ++ tmp_name[0], ++ tmp_name[1], ++ tmp_name[2], ++ tmp_name[3], ++ tmp_name[4], ++ tmp_name[5], ++ tmp_name[6], ++ tmp_name[7]); ++ printk(KERN_INFO ++ " Using port name from NVRAM.\n"); ++ } ++ ++ qla2x00_cfg_persistent_binding(ha); ++} ++ ++/* ++ * qla2x00_cfg_persistent_binding ++ * Get driver configuration file target persistent binding entries. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_cfg_persistent_binding(scsi_qla_host_t *ha) ++{ ++ int rval; ++ static char propbuf[LINESIZE]; ++ uint16_t tgt; ++ uint16_t dev_no = 0; /* not used */ ++ char *cmdline = ha->cmdline; ++ port_id_t d_id, *pd_id; ++ uint8_t portid[3]; ++ uint8_t node_name[8], *pnn; ++ uint8_t port_name[8], *ppn; ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ /* FC name for devices */ ++ for (tgt = 0; tgt < MAX_FIBRE_DEVICES; tgt++) { ++ ++ /* ++ * Retrive as much information as possible (PN/PID/NN). ++ * ++ * Based on binding type, skip incomplete entries. ++ */ ++ ppn = port_name; ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-port", ++ (int)ha->instance, tgt, dev_no); ++ rval = qla2x00_get_prop_16chars(ha, propbuf, ppn, cmdline); ++ if (rval != 0) ++ ppn = NULL; ++ if (ha->binding_type == BIND_BY_PORT_NAME && rval != 0) ++ continue; ++ ++ pd_id = &d_id; ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-pid", ++ (int)ha->instance, tgt, dev_no); ++ rval = qla2x00_get_prop_xstr(ha, ++ propbuf, portid, sizeof(portid)); ++ if (rval == -1 || rval != sizeof(portid)) ++ pd_id = NULL; ++ if (ha->binding_type == BIND_BY_PORT_ID && ++ (rval == -1 || rval != sizeof(portid))) ++ continue; ++ ++ pnn = node_name; ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-node", ++ (int)ha->instance, tgt, dev_no); ++ rval = qla2x00_get_prop_16chars(ha, propbuf, pnn, cmdline); ++ if (rval != 0) ++ pnn = NULL; ++ if (ha->binding_type == BIND_BY_NODE_NAME && rval != 0) ++ continue; ++ ++ tq = qla2x00_tgt_alloc(ha, tgt); ++ if (tq == NULL) { ++ printk(KERN_WARNING ++ "%s(): Unable to allocate memory for target\n", ++ __func__); ++ continue; ++ } ++ ++ ha->fc_db[tgt].loop_id = PORT_AVAILABLE; ++ ha->fc_db[tgt].flag = 0; /* v2.19.05b3 */ ++ ha->fc_db[tgt].flag |= DEV_CONFIGURED; ++ ++ if (ppn != NULL) { ++ memcpy(tq->port_name, ppn, WWN_SIZE); ++ memcpy(ha->fc_db[tgt].wwn, ppn, WWN_SIZE); ++ } ++ if (pd_id != NULL) { ++ /* ++ * The portid is read in big-endian format, convert ++ * before updating information ++ */ ++ pd_id->r.d_id[0] = portid[2]; ++ pd_id->r.d_id[1] = portid[1]; ++ pd_id->r.d_id[2] = portid[0]; ++ tq->d_id.b24 = pd_id->b24; ++ ha->fc_db[tgt].d_id.b24 = pd_id->b24; ++ } ++ if (pnn != NULL) { ++ memcpy(tq->node_name, pnn, WWN_SIZE); ++ memcpy(ha->fc_db[tgt].name, pnn, WWN_SIZE); ++ } ++ ++ DEBUG(printk("Target %03d - configured by user: ",tgt);) ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ DEBUG(printk("tgt-%03d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ tgt, ++ ppn[0], ppn[1], ppn[2], ppn[3], ++ ppn[4], ppn[5], ppn[6], ppn[7]);) ++ break; ++ ++ case BIND_BY_PORT_ID: ++ DEBUG(printk("tgt-%03d=%02x%02x%02x\n", ++ tgt, ++ pd_id->b.domain, ++ pd_id->b.area, ++ pd_id->b.al_pa)); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ DEBUG(printk("tgt-%03d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ tgt, ++ pnn[0], pnn[1], pnn[2], pnn[3], ++ pnn[4], pnn[5], pnn[6], pnn[7]);) ++ break; ++ } ++ /* look for VSA */ ++#if VSA ++ qla2x00_get_vsa_opt_from_config(ha, tgt, dev_no); ++#endif ++ ++ } ++ ++ LEAVE(__func__); ++} ++ ++/* ++* qla2x00_abort_isp ++* Resets ISP and aborts all outstanding commands. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++uint8_t ++qla2x00_abort_isp(scsi_qla_host_t *ha, uint8_t flag) ++{ ++ unsigned long flags = 0; ++ uint16_t cnt; ++ srb_t *sp; ++ uint8_t status = 0; ++ ++ ENTER("qla2x00_abort_isp"); ++ ++ if (ha->flags.online) { ++ ha->flags.online = FALSE; ++ clear_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ clear_bit(COMMAND_WAIT_ACTIVE, &ha->dpc_flags); ++ clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ qla2x00_stats.ispAbort++; ++ ha->total_isp_aborts++; /* used by ioctl */ ++ ha->sns_retry_cnt = 0; ++ ++ printk(KERN_INFO ++ "scsi(%ld): Performing ISP error recovery - ha= %p.\n", ++ ha->host_no, ha); ++ qla2x00_reset_chip(ha); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ /* Return all IP send packets */ ++ for (cnt = 0; cnt < MAX_SEND_PACKETS; cnt++) { ++ if (ha->active_scb_q[cnt] != NULL) { ++ /* Via IP callback */ ++ (*ha->send_completion_routine) ++ (ha->active_scb_q[cnt]); ++ ++ ha->active_scb_q[cnt] = NULL; ++ } ++ } ++#endif ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ /* Requeue all commands in outstanding command list. */ ++ for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ ha->outstanding_cmds[cnt] = 0; ++ if( ha->actthreads ) ++ ha->actthreads--; ++ sp->lun_queue->out_cnt--; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ ++ sp->flags = 0; ++ ++ /* ++ * We need to send the command back to OS now ++ * if returning RESET status for kernel's ++ * error handling. ++ */ ++ if (flag == 0) { ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ } else { ++ CMD_RESULT(sp->cmd) = DID_RESET << 16; ++ } ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ add_to_done_queue(ha, sp); ++ } ++ } ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++#if defined(ISP2100) ++ qla2100_nvram_config(ha); ++#else ++ qla2x00_nvram_config(ha); ++#endif ++ ++ if (!qla2x00_restart_isp(ha)) { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ++ if (!atomic_read(&ha->loop_down_timer)) { ++ /* ++ * Issue marker command only when we are going ++ * to start the I/O . ++ */ ++ ha->marker_needed = 1; ++ } ++ ++ ha->flags.online = TRUE; ++ ++#if defined(FC_IP_SUPPORT) ++ /* Reenable IP support */ ++ if (ha->flags.enable_ip) { ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ qla2x00_ip_initialize(ha); ++ } ++#endif ++ /* Enable ISP interrupts. */ ++ qla2x00_enable_intrs(ha); ++ ++ /* v2.19.5b6 Return all commands */ ++ qla2x00_abort_queues(ha, TRUE); ++ ++ /* Restart queues that may have been stopped. */ ++ qla2x00_restart_queues(ha,TRUE); ++ ha->isp_abort_cnt = 0; ++ clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ } else { /* failed the ISP abort */ ++ ha->flags.online = TRUE; ++ if( test_bit(ISP_ABORT_RETRY, &ha->dpc_flags) ){ ++ if( ha->isp_abort_cnt == 0 ){ ++ printk(KERN_WARNING ++ "qla2x00(%ld): ISP error recovery failed - " ++ "board disabled\n",ha->host_no); ++ /* ++ * The next call disables the board ++ * completely. ++ */ ++ qla2x00_reset_adapter(ha); ++ qla2x00_abort_queues(ha, FALSE); ++ ha->flags.online = TRUE; ++ clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ status = 0; ++ } else { /* schedule another ISP abort */ ++ ha->isp_abort_cnt--; ++ DEBUG(printk("qla%ld: ISP abort - retry remainning %d\n", ++ ha->host_no, ++ ha->isp_abort_cnt);) ++ status = 1; ++ } ++ } else { ++ ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT; ++ DEBUG(printk( "qla2x00(%ld): ISP error recovery - " ++ "retrying (%d) more times\n",ha->host_no, ++ ha->isp_abort_cnt);) ++ set_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ status = 1; ++ } ++ } ++ ++ } ++ ++ if (status) { ++ printk(KERN_INFO ++ "qla2x00_abort_isp(%ld): **** FAILED ****\n", ++ ha->host_no); ++ } else { ++ DEBUG(printk(KERN_INFO ++ "qla2x00_abort_isp(%ld): exiting.\n", ++ ha->host_no);) ++ } ++ ++ return(status); ++} ++ ++/* ++* qla2x00_restart_isp ++* restarts the ISP after a reset ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++static int ++qla2x00_restart_isp(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++#if defined(ISP2300) ++ device_reg_t *reg; ++ unsigned long flags = 0; ++#endif ++ ++ /* If firmware needs to be loaded */ ++ if (qla2x00_isp_firmware(ha)) { ++ ha->flags.online = FALSE; ++ if (!(status = qla2x00_chip_diag(ha))) { ++#if defined(ISP2300) ++ reg = ha->iobase; ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ /* Disable SRAM, Instruction RAM and GP RAM parity. */ ++ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x0)); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++#endif ++ status = qla2x00_setup_chip(ha); ++#if defined(ISP2300) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Enable proper parity */ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) ++ /* SRAM, Instruction RAM and GP RAM parity */ ++ WRT_REG_WORD(®->hccr, ++ (HCCR_ENABLE_PARITY + 0x7)); ++ else ++ /* SRAM parity */ ++ WRT_REG_WORD(®->hccr, ++ (HCCR_ENABLE_PARITY + 0x1)); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++#endif ++ } ++ } ++ if (!status && !(status = qla2x00_init_rings(ha))) { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ clear_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ if (!(status = qla2x00_fw_ready(ha))) { ++ DEBUG(printk("%s(): Start configure loop, " ++ "status = %d\n", ++ __func__, ++ status);) ++ ha->flags.online = TRUE; ++ do { ++ clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ qla2x00_configure_loop(ha); ++ } while (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) && ++ (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))); ++ } ++ ++ /* if no cable then assume it's good */ ++ if ((ha->device_flags & DFLG_NO_CABLE)) ++ status = 0; ++ ++ DEBUG(printk("%s(): Configure loop done, status = 0x%x\n", ++ __func__, ++ status);) ++ } ++ return (status); ++} ++ ++/* ++* qla2x00_reset_adapter ++* Reset adapter. ++* ++* Input: ++* ha = adapter block pointer. ++*/ ++static void ++qla2x00_reset_adapter(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg = ha->iobase; ++ ++ ENTER(__func__); ++ ++ ha->flags.online = FALSE; ++ qla2x00_disable_intrs(ha); ++ /* Reset RISC processor. */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ LEAVE(__func__); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_inline.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,375 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ */ ++ ++ ++static __inline__ uint16_t qla2x00_debounce_register(volatile uint16_t *); ++/* ++ * qla2x00_debounce_register ++ * Debounce register. ++ * ++ * Input: ++ * port = register address. ++ * ++ * Returns: ++ * register value. ++ */ ++static __inline__ uint16_t ++qla2x00_debounce_register(volatile uint16_t *addr) ++{ ++ volatile uint16_t first; ++ volatile uint16_t second; ++ ++ do { ++ first = RD_REG_WORD(addr); ++ barrier(); ++ second = RD_REG_WORD(addr); ++ } while (first != second); ++ ++ return (first); ++} ++ ++static __inline__ void qla2x00_config_dma_addressing(scsi_qla_host_t *ha); ++ ++/** ++ * qla2x00_config_dma_addressing() - Configure OS DMA addressing method. ++ * @ha: HA context ++ * ++ * At exit, the @ha's flags.enable_64bit_addressing set to indicated ++ * supported addressing method. ++ */ ++static __inline__ void ++qla2x00_config_dma_addressing(scsi_qla_host_t *ha) ++{ ++ /* ++ * Given the two variants pci_set_dma_mask(), allow the compiler to ++ * assist in setting the proper dma mask. ++ */ ++ if (sizeof(dma_addr_t) > 4) { ++ ha->flags.enable_64bit_addressing = 1; ++ /* Update our PCI device dma_mask for full 64 bits */ ++ if (pci_set_dma_mask(ha->pdev, 0xffffffffffffffffULL)) { ++ printk("scsi(%ld): Failed to set 64 bit PCI DMA mask, " ++ "using 32 bits\n", ++ ha->host_no); ++ ha->flags.enable_64bit_addressing = 0; ++ pci_set_dma_mask(ha->pdev, 0xffffffff); ++ } ++ } ++ else { ++ ha->flags.enable_64bit_addressing = 0; ++ pci_set_dma_mask(ha->pdev, 0xffffffff); ++ } ++ printk(KERN_INFO ++ "scsi(%ld): %d Bit DMA Addressing Enabled.\n", ++ ha->host_no, ++ (ha->flags.enable_64bit_addressing ? 64 : 32)); ++} ++ ++ ++static __inline__ int qla2x00_normalize_dma_addr( ++ dma_addr_t *e_addr, uint32_t *e_len, ++ dma_addr_t *ne_addr, uint32_t *ne_len); ++ ++/** ++ * qla2x00_normalize_dma_addr() - Normalize an DMA address. ++ * @e_addr: Raw DMA address ++ * @e_len: Raw DMA length ++ * @ne_addr: Normalized second DMA address ++ * @ne_len: Normalized second DMA length ++ * ++ * If the address does not span a 4GB page boundary, the contents of @ne_addr ++ * and @ne_len are undefined. @e_len is updated to reflect a normalization. ++ * ++ * Example: ++ * ++ * ffffabc0ffffeeee (e_addr) start of DMA address ++ * 0000000020000000 (e_len) length of DMA transfer ++ * ffffabc11fffeeed end of DMA transfer ++ * ++ * Is the 4GB boundary crossed? ++ * ++ * ffffabc0ffffeeee (e_addr) ++ * ffffabc11fffeeed (e_addr + e_len - 1) ++ * 00000001e0000003 ((e_addr ^ (e_addr + e_len - 1)) ++ * 0000000100000000 ((e_addr ^ (e_addr + e_len - 1)) & ~(0xffffffff) ++ * ++ * Compute start of second DMA segment: ++ * ++ * ffffabc0ffffeeee (e_addr) ++ * ffffabc1ffffeeee (0x100000000 + e_addr) ++ * ffffabc100000000 (0x100000000 + e_addr) & ~(0xffffffff) ++ * ffffabc100000000 (ne_addr) ++ * ++ * Compute length of second DMA segment: ++ * ++ * 00000000ffffeeee (e_addr & 0xffffffff) ++ * 0000000000001112 (0x100000000 - (e_addr & 0xffffffff)) ++ * 000000001fffeeee (e_len - (0x100000000 - (e_addr & 0xffffffff)) ++ * 000000001fffeeee (ne_len) ++ * ++ * Adjust length of first DMA segment ++ * ++ * 0000000020000000 (e_len) ++ * 0000000000001112 (e_len - ne_len) ++ * 0000000000001112 (e_len) ++ * ++ * Returns non-zero if the specified address was normalized, else zero. ++ */ ++static __inline__ int ++qla2x00_normalize_dma_addr( ++ dma_addr_t *e_addr, uint32_t *e_len, ++ dma_addr_t *ne_addr, uint32_t *ne_len) ++{ ++ int normalized; ++ ++ normalized = 0; ++ if ((*e_addr ^ (*e_addr + *e_len - 1)) & ~(0xFFFFFFFFULL)) { ++ /* Compute normalized crossed address and len */ ++ *ne_addr = (0x100000000ULL + *e_addr) & ~(0xFFFFFFFFULL); ++ *ne_len = *e_len - (0x100000000ULL - (*e_addr & 0xFFFFFFFFULL)); ++ *e_len -= *ne_len; ++ ++ normalized++; ++ } ++ return (normalized); ++} ++ ++static __inline__ void qla2x00_poll(scsi_qla_host_t *); ++static inline void ++qla2x00_poll(scsi_qla_host_t *ha) ++{ ++ qla2x00_intr_handler(0, ha, NULL); ++} ++ ++ ++static __inline__ void qla2x00_enable_intrs(scsi_qla_host_t *); ++static __inline__ void qla2x00_disable_intrs(scsi_qla_host_t *); ++ ++static inline void ++qla2x00_enable_intrs(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ reg = ha->iobase; ++ ha->interrupts_on = 1; ++ /* enable risc and host interrupts */ ++ WRT_REG_WORD(®->ictrl, ICR_EN_INT | ICR_EN_RISC); ++ CACHE_FLUSH(®->ictrl); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++} ++ ++static inline void ++qla2x00_disable_intrs(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ reg = ha->iobase; ++ ha->interrupts_on = 0; ++ /* disable risc and host interrupts */ ++ WRT_REG_WORD(®->ictrl, 0); ++ CACHE_FLUSH(®->ictrl); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++ ++ ++static __inline__ int qla2x00_is_wwn_zero(uint8_t *); ++ ++/* ++ * qla2x00_is_wwn_zero - Check for zero node name ++ * ++ * Input: ++ * wwn = Pointer to WW name to check ++ * ++ * Returns: ++ * TRUE if name is 0 else FALSE ++ * ++ * Context: ++ * Kernel context. ++ */ ++static __inline__ int ++qla2x00_is_wwn_zero(uint8_t *wwn) ++{ ++ int cnt; ++ ++ for (cnt = 0; cnt < WWN_SIZE ; cnt++, wwn++) { ++ if (*wwn != 0) ++ break; ++ } ++ /* if zero return TRUE */ ++ if (cnt == WWN_SIZE) ++ return (1); ++ else ++ return (0); ++} ++ ++static __inline__ uint8_t ++qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int); ++static __inline__ uint8_t ++qla2x00_delay_lun(scsi_qla_host_t *, os_lun_t *, int); ++ ++static __inline__ uint8_t ++qla2x00_suspend_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time, int count) ++{ ++ return (__qla2x00_suspend_lun(ha, lq, time, count, 0)); ++} ++ ++static __inline__ uint8_t ++qla2x00_delay_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time) ++{ ++ return (__qla2x00_suspend_lun(ha, lq, time, 1, 1)); ++} ++ ++ ++ ++static __inline__ void qla2x00_chg_endian(uint8_t *, size_t); ++/* ++ * qla2x00_chg_endian ++ * Change endianess of byte array. ++ * ++ * Input: ++ * buf = array pointer. ++ * size = size of array in bytes. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static __inline__ void ++qla2x00_chg_endian(uint8_t *buf, size_t size) ++{ ++ uint8_t byte; ++ size_t cnt1; ++ size_t cnt; ++ ++ cnt1 = size - 1; ++ for (cnt = 0; cnt < size / 2; cnt++) { ++ byte = buf[cnt1]; ++ buf[cnt1] = buf[cnt]; ++ buf[cnt] = byte; ++ cnt1--; ++ } ++} ++ ++static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *); ++/* ++ * This routine will wait for fabric devices for ++ * the reset delay. ++ */ ++static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *ha) ++{ ++ uint16_t fw_state; ++ ++ qla2x00_get_firmware_state(ha, &fw_state); ++} ++ ++static inline void qla2x00_filter_command(scsi_qla_host_t *ha, srb_t *sp); ++static inline void ++qla2x00_filter_command(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ Scsi_Cmnd *cp = sp->cmd; ++ uint8_t *strp; ++ ++ /* ++ * Special case considertaion on an Inquiry command (0x12) for Lun 0, ++ * device responds with no devices (0x7F), then Linux will not scan ++ * further Luns. While reporting that some device exists on Lun 0 Linux ++ * will scan all devices on this target. ++ */ ++ if (qla2xenbinq && (cp->cmnd[0] == INQUIRY) && (SCSI_LUN_32(cp) == 0)) { ++ strp = (uint8_t *)cp->request_buffer; ++ if (*strp == 0x7f) { ++ /* Make lun unassigned and processor type */ ++ *strp = 0x23; ++ } ++ } ++} ++ ++static __inline__ void * qla2x00_kmem_zalloc(int, int, int); ++/* ++ * qla2x00_kmem_zalloc ++ * Allocate and zero out the block of memory ++ */ ++static __inline__ void * ++qla2x00_kmem_zalloc(int siz, int code, int id) ++{ ++ uint8_t *bp; ++ ++ if ((bp = kmalloc(siz, code)) != NULL) { ++ memset(bp, 0, siz); ++ } ++#if QL_TRACE_MEMORY ++ if (mem_trace_ptr == 1000) ++ mem_trace_ptr = 0; ++ mem_trace[mem_trace_ptr] = (u_long ) bp; ++ mem_id[mem_trace_ptr++] = (u_long ) id; ++#endif ++ ++ return ((void *)bp); ++} ++ ++ ++static __inline__ ms_iocb_entry_t * ++qla2x00_prep_ms_iocb(scsi_qla_host_t *, uint32_t, uint32_t); ++/** ++ * qla2x00_prep_ms_iocb() - Prepare common MS IOCB fields for SNS CT query. ++ * @ha: HA context ++ * @req_size: request size in bytes ++ * @rsp_size: response size in bytes ++ * ++ * Returns a pointer to the @ha's ms_iocb. ++ */ ++static __inline__ ms_iocb_entry_t * ++qla2x00_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size) ++{ ++ ms_iocb_entry_t *ms_pkt; ++ ++ ms_pkt = ha->ms_iocb; ++ memset(ms_pkt, 0, sizeof(ms_iocb_entry_t)); ++ ++ ms_pkt->entry_type = MS_IOCB_TYPE; ++ ms_pkt->entry_count = 1; ++#if defined(EXTENDED_IDS) ++ ms_pkt->loop_id = __constant_cpu_to_le16(SIMPLE_NAME_SERVER); ++#else ++ ms_pkt->loop_id = SIMPLE_NAME_SERVER; ++#endif ++ ms_pkt->control_flags = ++ __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG); ++ ms_pkt->timeout = __constant_cpu_to_le16(25); ++ ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); ++ ms_pkt->total_dsd_count = __constant_cpu_to_le16(2); ++ ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); ++ ms_pkt->req_bytecount = cpu_to_le32(req_size); ++ ++ ms_pkt->dseg_req_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_req_length = ms_pkt->req_bytecount; ++ ++ ms_pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount; ++ ++ return (ms_pkt); ++} ++ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_iocb.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1276 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++static inline uint16_t qla2x00_get_cmd_direction(Scsi_Cmnd *cmd); ++ ++static inline int qla2x00_cmd_build_iocb(scsi_qla_host_t *ha, ++ srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds); ++ ++static inline int qla2x00_cmd_build_64bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds); ++ ++static inline int qla2x00_cmd_build_32bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds); ++ ++static inline int qla2x00_check_request_ring(scsi_qla_host_t *ha, ++ uint16_t tot_iocbs, uint16_t req_ring_index, uint16_t *req_q_cnt); ++ ++static inline cont_a64_entry_t *qla2x00_prep_a64_cont_packet( ++ scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr); ++ ++static inline cont_entry_t *qla2x00_prep_cont_packet(scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr); ++ ++ ++/* Command queuing function */ ++ ++/** ++ * qla2x00_get_cmd_direction() - Determine control_flag data direction. ++ * @cmd: SCSI command ++ * ++ * This is ridiculous, the mid-layer applications should perform this step for ++ * all commands sent down through the SCSI layers. The following is a terrible ++ * hack. ++ * ++ * Returns the proper CF_* direction based on CDB. ++ */ ++static inline uint16_t ++qla2x00_get_cmd_direction(Scsi_Cmnd *cmd) ++{ ++ uint16_t cflags; ++ ++ cflags = 0; ++ ++#if defined(SANE_USAGE_OF_CMD_DIRECTION) ++ /* Set transfer direction */ ++ if (cmd->sc_data_direction == SCSI_DATA_WRITE) ++ cflags = CF_WRITE; ++ else if (cmd->sc_data_direction == SCSI_DATA_READ) ++ cflags = CF_READ; ++ else { ++ switch (cmd->data_cmnd[0]) { ++ case WRITE_6: ++ case WRITE_10: ++ case WRITE_12: ++ case WRITE_BUFFER: ++ case WRITE_LONG: ++ case WRITE_SAME: ++ case WRITE_VERIFY: ++ case WRITE_VERIFY_12: ++ case FORMAT_UNIT: ++ case SEND_VOLUME_TAG: ++ case MODE_SELECT: ++ case SEND_DIAGNOSTIC: ++ case MODE_SELECT_10: ++ cflags = CF_WRITE; ++ break; ++ default: ++ cflags = CF_READ; ++ break; ++ } ++ } ++#else ++ switch (cmd->data_cmnd[0]) { ++ case WRITE_6: ++ case WRITE_10: ++ case WRITE_12: ++ case WRITE_BUFFER: ++ case WRITE_LONG: ++ case WRITE_SAME: ++ case WRITE_VERIFY: ++ case WRITE_VERIFY_12: ++ case FORMAT_UNIT: ++ case SEND_VOLUME_TAG: ++ case MODE_SELECT: ++ case SEND_DIAGNOSTIC: ++ case MODE_SELECT_10: ++ cflags = CF_WRITE; ++ break; ++ default: ++ if (cmd->sc_data_direction == SCSI_DATA_WRITE) ++ cflags = CF_WRITE; ++ else ++ cflags = CF_READ; ++ break; ++ } ++#endif ++ ++ return (cflags); ++} ++ ++/** ++ * qla2x00_check_request_ring() - Checks request ring for additional IOCB space. ++ * @ha: HA context ++ * @tot_iocbs: Number of IOCBs required ++ * @req_ring_index: Current index to request ring ++ * @req_q_cnt: Number of free request entries ++ * ++ * Returns non-zero if no additional room available on request ring, else zero. ++ */ ++static inline int ++qla2x00_check_request_ring(scsi_qla_host_t *ha, ++ uint16_t tot_iocbs, uint16_t req_ring_index, uint16_t *req_q_cnt) ++{ ++ uint16_t ret; ++ uint16_t cnt; ++ device_reg_t *reg; ++ ++ reg = ha->iobase; ++ ++ /* If room for request in request ring for at least N IOCB */ ++ ret = 0; ++ if ((tot_iocbs + 2) >= *req_q_cnt) { ++ /* ++ * Calculate number of free request entries. ++ */ ++ cnt = RD_REG_WORD(ISP_REQ_Q_OUT(reg)); ++ if (req_ring_index < cnt) ++ *req_q_cnt = cnt - req_ring_index; ++ else ++ *req_q_cnt = REQUEST_ENTRY_CNT - (req_ring_index - cnt); ++ } ++ if ((tot_iocbs + 2) >= *req_q_cnt) { ++ DEBUG5(printk("scsi(%ld): in-ptr=%x req_q_cnt=%x " ++ "tot_iocbs=%x.\n", ++ ha->host_no, req_ring_index, *req_q_cnt, tot_iocbs)); ++ ++ ret++; ++ } ++#if defined(IOCB_THROLLE_USAGE) ++ if ((ha->iocb_cnt + tot_iocbs) >= ha->iocb_hiwat) { ++ DEBUG5(printk("%s(): Not Enough IOCBS for request. " ++ "iocb_cnt=%x, tot_iocbs=%x, hiwat=%x.\n", ++ __func__, ha->iocb_cnt, tot_iocbs, ha->iocb_hiwat)); ++#if defined(IOCB_HIT_RATE) ++ ha->iocb_overflow_cnt++; ++#endif ++ ret++; ++ } ++#endif ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_prep_a64_cont_packet() - Initialize an A64 continuation packet. ++ * @ha: HA context ++ * @req_ring_index: Current index to request ring ++ * @req_ring_ptr: Current pointer to request ring ++ * ++ * Returns a pointer to the continuation packet. ++ */ ++static inline cont_a64_entry_t * ++qla2x00_prep_a64_cont_packet(scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr) ++{ ++ cont_a64_entry_t *cont_pkt; ++ ++ /* Adjust ring index. */ ++ *req_ring_index += 1; ++ if (*req_ring_index == REQUEST_ENTRY_CNT) { ++ *req_ring_index = 0; ++ *request_ring_ptr = ha->request_ring; ++ } else ++ *request_ring_ptr += 1; ++ ++ cont_pkt = (cont_a64_entry_t *)(*request_ring_ptr); ++ ++ /* Load packet defaults. */ ++ *((uint32_t *)(&cont_pkt->entry_type)) = ++ __constant_cpu_to_le32(CONTINUE_A64_TYPE); ++ //cont_pkt->entry_type = CONTINUE_A64_TYPE; ++ //cont_pkt->entry_count = 0; ++ //cont_pkt->sys_define = (uint8_t)req_ring_index; ++ ++ return (cont_pkt); ++} ++ ++/** ++ * qla2x00_prep_cont_packet() - Initialize a continuation packet. ++ * @ha: HA context ++ * @req_ring_index: Current index to request ring ++ * @req_ring_ptr: Current pointer to request ring ++ * ++ * Returns a pointer to the continuation packet. ++ */ ++static inline cont_entry_t * ++qla2x00_prep_cont_packet(scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr) ++{ ++ cont_entry_t *cont_pkt; ++ ++ /* Adjust ring index. */ ++ *req_ring_index += 1; ++ if (*req_ring_index == REQUEST_ENTRY_CNT) { ++ *req_ring_index = 0; ++ *request_ring_ptr = ha->request_ring; ++ } else ++ *request_ring_ptr += 1; ++ ++ cont_pkt = (cont_entry_t *)(*request_ring_ptr); ++ ++ /* Load packet defaults. */ ++ *((uint32_t *)(&cont_pkt->entry_type)) = ++ __constant_cpu_to_le32(CONTINUE_TYPE); ++ //cont_pkt->entry_type = CONTINUE_TYPE; ++ //cont_pkt->entry_count = 0; ++ //cont_pkt->sys_define = (uint8_t)req_ring_index; ++ ++ return (cont_pkt); ++} ++ ++static inline int ++qla2x00_cmd_build_64bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, ++ cmd_entry_t *cmd_pkt, ++ uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds) ++{ ++ uint16_t avail_dsds; ++ uint32_t *cur_dsd; ++ Scsi_Cmnd *cmd; ++ ++ cmd = sp->cmd; ++ ++ /* No data transfer */ ++ if (cmd->request_bufflen == 0 || ++ cmd->sc_data_direction == SCSI_DATA_NONE) { ++ cmd_pkt->byte_count = __constant_cpu_to_le32(0); ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(cmd)); ++ sp->dir = cmd_pkt->control_flags & ++ __constant_cpu_to_le16(CF_READ | CF_WRITE); ++ ++ /* Two DSDs are available in the command 64 IOCB */ ++ avail_dsds = 2; ++ cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; ++ ++ /* Load data segments */ ++ if (cmd->use_sg != 0) { ++ struct scatterlist *cur_seg; ++ struct scatterlist *end_seg; ++ int nseg; ++ ++ cur_seg = (struct scatterlist *)cmd->request_buffer; ++ nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ end_seg = cur_seg + nseg; ++ while (cur_seg < end_seg) { ++ int failed; ++ dma_addr_t sle_dma; ++ uint32_t sle_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ cont_a64_entry_t *cont_pkt; ++ ++ /* Allocate additional continuation packets? */ ++ if (avail_dsds == 0) { ++ *tot_iocbs += 1; ++ failed = qla2x00_check_request_ring(ha, ++ *tot_iocbs, ++ *req_ring_index, ++ req_q_cnt); ++ if (failed) { ++ goto mapped_queuing_error_64; ++ } ++ ++ cont_pkt = qla2x00_prep_a64_cont_packet(ha, ++ req_ring_index, ++ request_ring_ptr); ++ ++ cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; ++ avail_dsds = 5; ++ } ++ ++ sle_dma = sg_dma_address(cur_seg); ++ sle_len = sg_dma_len(cur_seg); ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &sle_dma, &sle_len, ++ &nml_dma, &nml_len); ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); ++ *cur_dsd++ = cpu_to_le32(sle_len); ++ *tot_dsds += 1; ++ avail_dsds--; ++ ++ cur_seg++; ++ if (!normalized) ++ continue; ++ ++ /* ++ * Allocate additional continuation packets? ++ */ ++ if (avail_dsds == 0) { ++ *tot_iocbs += 1; ++ failed = qla2x00_check_request_ring(ha, ++ *tot_iocbs, ++ *req_ring_index, ++ req_q_cnt); ++ if (failed) ++ goto mapped_queuing_error_64; ++ ++ cont_pkt = qla2x00_prep_a64_cont_packet(ha, ++ req_ring_index, ++ request_ring_ptr); ++ ++ cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; ++ avail_dsds = 5; ++ } ++ ++ *cur_dsd++ = cpu_to_le32(LSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(nml_len); ++ *tot_dsds += 1; ++ avail_dsds--; ++ } ++ } ++ else { ++ /* ++ * No more than 1 (one) IOCB is needed for this type of ++ * request, even if the DMA address spans the 4GB page ++ * boundary. ++ * ++ * @tot_dsds == 1 if non-spanning, else 2 ++ */ ++ dma_addr_t req_dma; ++ uint32_t req_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ struct page *page; ++ unsigned long offset; ++ ++ page = virt_to_page(cmd->request_buffer); ++ offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK); ++ req_dma = pci_map_page(ha->pdev, ++ page, ++ offset, ++ cmd->request_bufflen, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ req_len = cmd->request_bufflen; ++ ++ sp->saved_dma_handle = req_dma; ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &req_dma, &req_len, ++ &nml_dma, &nml_len); ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(LSD(req_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(req_dma)); ++ *cur_dsd++ = cpu_to_le32(req_len); ++ *tot_dsds += 1; ++ ++ if (normalized) { ++ *cur_dsd++ = cpu_to_le32(LSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(nml_len); ++ *tot_dsds += 1; ++ } ++ } ++ ++ return (QL_STATUS_SUCCESS); ++ ++mapped_queuing_error_64: ++ pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer, ++ cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ return (QL_STATUS_ERROR); ++} ++ ++static inline int ++qla2x00_cmd_build_32bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, ++ cmd_entry_t *cmd_pkt, ++ uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds) ++{ ++ uint16_t avail_dsds; ++ uint32_t *cur_dsd; ++ Scsi_Cmnd *cmd; ++ ++ cmd = sp->cmd; ++ ++ /* No data transfer */ ++ if (cmd->request_bufflen == 0 || ++ cmd->sc_data_direction == SCSI_DATA_NONE) { ++ cmd_pkt->byte_count = __constant_cpu_to_le32(0); ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(cmd)); ++ sp->dir = cmd_pkt->control_flags & ++ __constant_cpu_to_le16(CF_READ | CF_WRITE); ++ ++ /* Three DSDs are available in the command IOCB */ ++ avail_dsds = 3; ++ cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; ++ ++ /* Load data segments */ ++ if (cmd->use_sg != 0) { ++ struct scatterlist *cur_seg; ++ struct scatterlist *end_seg; ++ int nseg; ++ ++ cur_seg = (struct scatterlist *)cmd->request_buffer; ++ nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ end_seg = cur_seg + nseg; ++ ++ while (cur_seg < end_seg) { ++ int failed; ++ dma_addr_t sle_dma; ++ uint32_t sle_len; ++ cont_entry_t *cont_pkt; ++ ++ /* Allocate additional continuation packets? */ ++ if (avail_dsds == 0) { ++ *tot_iocbs += 1; ++ failed = qla2x00_check_request_ring(ha, ++ *tot_iocbs, ++ *req_ring_index, ++ req_q_cnt); ++ if (failed) { ++ goto mapped_queuing_error_32; ++ } ++ ++ cont_pkt = qla2x00_prep_cont_packet(ha, ++ req_ring_index, ++ request_ring_ptr); ++ ++ cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; ++ avail_dsds = 7; ++ } ++ ++ sle_dma = sg_dma_address(cur_seg); ++ sle_len = sg_dma_len(cur_seg); ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(sle_dma); ++ *cur_dsd++ = cpu_to_le32(sle_len); ++ *tot_dsds += 1; ++ avail_dsds--; ++ ++ cur_seg++; ++ } ++ } ++ else { ++ /* ++ * No more than 1 (one) IOCB is needed for this type of request. ++ */ ++ dma_addr_t req_dma; ++ uint32_t req_len; ++ struct page *page; ++ unsigned long offset; ++ ++ page = virt_to_page(cmd->request_buffer); ++ offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK); ++ req_dma = pci_map_page(ha->pdev, ++ page, ++ offset, ++ cmd->request_bufflen, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ req_len = cmd->request_bufflen; ++ ++ sp->saved_dma_handle = req_dma; ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(req_dma); ++ *cur_dsd++ = cpu_to_le32(req_len); ++ *tot_dsds += 1; ++ } ++ ++ return (QL_STATUS_SUCCESS); ++ ++mapped_queuing_error_32: ++ pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer, ++ cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ return (QL_STATUS_ERROR); ++} ++ ++static inline int ++qla2x00_cmd_build_iocb(scsi_qla_host_t *ha, ++ srb_t *sp, ++ cmd_entry_t *cmd_pkt, ++ uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds) ++{ ++ int ret; ++ ++ ret = QL_STATUS_ERROR; ++ ++ if (ha->flags.enable_64bit_addressing) { ++ *((uint32_t *)(&cmd_pkt->entry_type)) = ++ __constant_cpu_to_le32(COMMAND_A64_TYPE); ++ //cmd_pkt->entry_type = COMMAND_A64_TYPE; ++ //cmd_pkt->entry_count = (uint8_t)tot_iocbs; ++ //cmd_pkt->sys_define = (uint8_t)ha->req_ring_index; ++ //cmd_pkt->entry_status = 0; ++ ++ ret = qla2x00_cmd_build_64bit_iocbs(ha, ++ sp, cmd_pkt, req_q_cnt, req_ring_index, request_ring_ptr, ++ tot_iocbs, tot_dsds); ++ ++ } else { ++ *((uint32_t *)(&cmd_pkt->entry_type)) = ++ __constant_cpu_to_le32(COMMAND_TYPE); ++ //cmd_pkt->entry_type = COMMAND_TYPE; ++ //cmd_pkt->entry_count = (uint8_t)tot_iocbs; ++ //cmd_pkt->sys_define = (uint8_t)ha->req_ring_index; ++ //cmd_pkt->entry_status = 0; ++ ++ ret = qla2x00_cmd_build_32bit_iocbs(ha, ++ sp, cmd_pkt, req_q_cnt, req_ring_index, request_ring_ptr, ++ tot_iocbs, tot_dsds); ++ } ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_start_scsi() - Send a SCSI command to the ISP ++ * @sp: command to send to the ISP ++ * ++ * Returns non-zero if a failure occured, else zero. ++ */ ++int ++qla2x00_start_scsi(srb_t *sp) ++{ ++ int ret; ++ unsigned long flags; ++ uint16_t failed; ++ scsi_qla_host_t *ha; ++ fc_lun_t *fclun; ++ Scsi_Cmnd *cmd; ++ uint16_t req_q_cnt; ++ uint16_t req_ring_index; ++ request_t *request_ring_ptr; ++ uint32_t *clr_ptr; ++ uint32_t found; ++ uint32_t index; ++ uint32_t handle; ++ uint16_t tot_iocbs; ++ uint16_t tot_dsds; ++ cmd_entry_t *cmd_pkt; ++ uint32_t timeout; ++ ++ device_reg_t *reg; ++ uint16_t reg_flushed; ++ ++ ENTER(__func__); ++ ++ /* Setup device pointers. */ ++ ret = 0; ++ fclun = sp->lun_queue->fclun; ++ ha = fclun->fcport->ha; ++ ++ cmd = sp->cmd; ++ reg = ha->iobase; ++ ++ DEBUG3(printk("scsi(%ld): cmd=%p sp=%p CDB=%x\n", ++ ha->host_no, ++ cmd, sp, cmd->cmnd[0])); ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) { ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ /* Acquire ring specific lock */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Save ha fields for post-update */ ++ req_ring_index = ha->req_ring_index; ++ request_ring_ptr = ha->request_ring_ptr; ++ req_q_cnt = ha->req_q_cnt; ++ ++ tot_dsds = 0; ++ tot_iocbs = 1; ++ ++ /* Allocate space for an additional IOCB */ ++ failed = qla2x00_check_request_ring(ha, ++ tot_iocbs, req_ring_index, &req_q_cnt); ++ if (failed) ++ goto queuing_error; ++ ++ /* Check for room in outstanding command list. */ ++ found = 0; ++ handle = ha->current_outstanding_cmd; ++ for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { ++ handle++; ++ if (handle == MAX_OUTSTANDING_COMMANDS) ++ handle = 1; ++ if (ha->outstanding_cmds[handle] == 0) { ++ found = 1; ++ ha->current_outstanding_cmd = handle; ++ break; ++ } ++ } ++ if (!found) { ++ DEBUG5(printk("scsi(%ld): Unable to queue command -- NO ROOM " ++ "IN OUTSTANDING ARRAY (req_q_cnt=%lx).\n", ++ ha->host_no, ++ (u_long)ha->req_q_cnt)); ++ goto queuing_error; ++ } ++ ++ /* ++ * Build command packet. ++ */ ++ cmd_pkt = (cmd_entry_t *)request_ring_ptr; ++ ++ cmd_pkt->handle = handle; ++ ++ /* Zero out remaining portion of packet. */ ++ clr_ptr = (uint32_t *)cmd_pkt + 2; ++ for (index = 2; index < REQUEST_ENTRY_SIZE / 4; index++) ++ *clr_ptr++ = 0; ++ ++ /* Set target ID */ ++#if defined(EXTENDED_IDS) ++ cmd_pkt->target = cpu_to_le16(fclun->fcport->loop_id & 0xFF); ++#else ++ cmd_pkt->target = (uint8_t)fclun->fcport->loop_id; ++#endif ++ ++ /* Set LUN number*/ ++#if VSA ++ if ((cmd->data_cmnd[0] == 0x26) || ++ (cmd->data_cmnd[0] == 0xA0) || ++ (cmd->data_cmnd[0] == 0xCB) ) { ++ cmd_pkt->lun = cpu_to_le16(fclun->lun); ++ } else if ((fclun->fcport->flags & FC_VSA)) ++ cmd_pkt->lun = cpu_to_le16(fclun->lun | 0x4000); ++ else ++ cmd_pkt->lun = cpu_to_le16(fclun->lun); ++#else ++ cmd_pkt->lun = cpu_to_le16(fclun->lun); ++#endif ++ ++ /* Update tagged queuing modifier */ ++ cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG); ++ if (cmd->device->tagged_queue) { ++ switch (cmd->tag) { ++ case HEAD_OF_QUEUE_TAG: ++ cmd_pkt->control_flags = ++ __constant_cpu_to_le16(CF_HEAD_TAG); ++ break; ++ case ORDERED_QUEUE_TAG: ++ cmd_pkt->control_flags = ++ __constant_cpu_to_le16(CF_ORDERED_TAG); ++ break; ++ } ++ } ++ ++ /* ++ * Allocate at least 5 (+ QLA_CMD_TIMER_DELTA) seconds for RISC timeout. ++ */ ++ timeout = (uint32_t) CMD_TIMEOUT(cmd)/HZ; ++ if (timeout > 65535) ++ cmd_pkt->timeout = __constant_cpu_to_le16(0); ++ if (timeout > 25) ++ cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout - ++ (5 + QLA_CMD_TIMER_DELTA)); ++ else ++ cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout); ++ ++ /* Load SCSI command packet. */ ++ memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len); ++ ++ cmd_pkt->byte_count = cpu_to_le32((uint32_t)cmd->request_bufflen); ++ ++ /* Load IOCB segments */ ++ ret = qla2x00_cmd_build_iocb(ha, ++ sp, ++ cmd_pkt, ++ &req_q_cnt, &req_ring_index, &request_ring_ptr, ++ &tot_iocbs, &tot_dsds); ++ if (ret) ++ goto queuing_error; ++ ++ /* Set total data segment count. */ ++ cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); ++ cmd_pkt->entry_count = (uint8_t)tot_iocbs; ++ ++ /* Update ha fields */ ++ ha->req_ring_index = req_ring_index; ++ ha->request_ring_ptr = request_ring_ptr; ++ ha->req_q_cnt = req_q_cnt; ++ ha->req_q_cnt -= tot_iocbs; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt += tot_iocbs; ++ ++ sp->iocb_cnt = tot_iocbs; ++#endif ++ ++ /* Add command to the active array */ ++ ha->outstanding_cmds[handle] = sp; ++ CMD_HANDLE(sp->cmd) = (unsigned char *)(u_long)handle; ++ ++ /* Adjust ring index. */ ++ ha->req_ring_index++; ++ if (ha->req_ring_index == REQUEST_ENTRY_CNT) { ++ ha->req_ring_index = 0; ++ ha->request_ring_ptr = ha->request_ring; ++ } else ++ ha->request_ring_ptr++; ++ ++ ha->actthreads++; ++ ha->total_ios++; ++ sp->ha = ha; ++ sp->lun_queue->out_cnt++; ++ sp->flags |= SRB_DMA_VALID; ++ sp->state = SRB_ACTIVE_STATE; ++ sp->u_start = jiffies; ++ ++ /* Set chip new ring index. */ ++ reg_flushed = CACHE_FLUSH(ISP_REQ_Q_IN(reg)); ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ return (QL_STATUS_SUCCESS); ++ ++queuing_error: ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ return (QL_STATUS_ERROR); ++} ++ ++ ++/** ++ * qla2x00_marker() - Send a marker IOCB to the firmware. ++ * @ha: HA context ++ * @loop_id: loop ID ++ * @lun: LUN ++ * @type: marker modifier ++ * ++ * Can be called from both normal and interrupt context. ++ * ++ * Returns non-zero if a failure occured, else zero. ++ */ ++int ++__qla2x00_marker(scsi_qla_host_t *ha, ++ uint16_t loop_id, ++ uint16_t lun, ++ uint8_t type) ++{ ++ mrk_entry_t *pkt; ++ ++ ENTER(__func__); ++ ++ pkt = (mrk_entry_t *)qla2x00_req_pkt(ha); ++ if (pkt == NULL) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ pkt->entry_type = MARKER_TYPE; ++ pkt->modifier = type; ++ ++ if (type != MK_SYNC_ALL) { ++ pkt->lun = cpu_to_le16(lun); ++#if defined(EXTENDED_IDS) ++ pkt->target = cpu_to_le16(loop_id & 0xFF); ++#else ++ pkt->target = (uint8_t)loop_id; ++#endif ++ } ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ LEAVE(__func__); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++int ++qla2x00_marker(scsi_qla_host_t *ha, ++ uint16_t loop_id, ++ uint16_t lun, ++ uint8_t type) ++{ ++ int ret; ++ unsigned long flags = 0; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ret = __qla2x00_marker(ha, loop_id, lun, type); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_req_pkt() - Retrieve a request packet from the request ring. ++ * @ha: HA context ++ * ++ * Note: The caller must hold the hardware lock before calling this routine. ++ * ++ * Returns NULL if function failed, else, a pointer to the request packet. ++ */ ++request_t * ++qla2x00_req_pkt(scsi_qla_host_t *ha) ++{ ++ device_reg_t *reg = ha->iobase; ++ request_t *pkt = NULL; ++ uint16_t cnt; ++ uint32_t *dword_ptr; ++ uint32_t timer; ++ uint16_t req_cnt = 1; ++ ++ ENTER(__func__); ++ ++ /* Wait 1 second for slot. */ ++ for (timer = HZ; timer; timer--) { ++ if ((req_cnt + 2) >= ha->req_q_cnt) { ++ /* Calculate number of free request entries. */ ++ cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg)); ++ if (ha->req_ring_index < cnt) ++ ha->req_q_cnt = cnt - ha->req_ring_index; ++ else ++ ha->req_q_cnt = REQUEST_ENTRY_CNT - ++ (ha->req_ring_index - cnt); ++ } ++ /* If room for request in request ring. */ ++ if ((req_cnt + 2) < ha->req_q_cnt) { ++ ha->req_q_cnt--; ++ pkt = ha->request_ring_ptr; ++ ++ /* Zero out packet. */ ++ dword_ptr = (uint32_t *)pkt; ++ for (cnt = 0; cnt < REQUEST_ENTRY_SIZE / 4; cnt++) ++ *dword_ptr++ = 0; ++ ++ /* Set system defined field. */ ++ pkt->sys_define = (uint8_t)ha->req_ring_index; ++ ++ /* Set entry count. */ ++ pkt->entry_count = 1; ++ ++ break; ++ } ++ ++ /* Release ring specific lock */ ++ spin_unlock(&ha->hardware_lock); ++ ++ udelay(2); /* 2 us */ ++ ++ /* Check for pending interrupts. */ ++ /* During init we issue marker directly */ ++ if (!ha->marker_needed) ++ qla2x00_poll(ha); ++ ++ spin_lock_irq(&ha->hardware_lock); ++ } ++ if (!pkt) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (pkt); ++} ++ ++/** ++ * qla2x00_ms_req_pkt() - Retrieve a Management Server request packet from ++ * the request ring. ++ * @ha: HA context ++ * @sp: pointer to handle post function call ++ * ++ * Note: The caller must hold the hardware lock before calling this routine. ++ * ++ * Returns NULL if function failed, else, a pointer to the request packet. ++ */ ++request_t * ++qla2x00_ms_req_pkt(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ device_reg_t *reg = ha->iobase; ++ request_t *pkt = NULL; ++ uint16_t cnt, i, index; ++ uint32_t *dword_ptr; ++ uint32_t timer; ++ uint8_t found = 0; ++ uint16_t req_cnt = 1; ++ ++ ENTER(__func__); ++ ++ /* Wait 1 second for slot. */ ++ for (timer = HZ; timer; timer--) { ++ if ((req_cnt + 2) >= ha->req_q_cnt) { ++ /* Calculate number of free request entries. */ ++ cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg)); ++ if (ha->req_ring_index < cnt) { ++ ha->req_q_cnt = cnt - ha->req_ring_index; ++ } else { ++ ha->req_q_cnt = REQUEST_ENTRY_CNT - ++ (ha->req_ring_index - cnt); ++ } ++ } ++ ++ /* Check for room in outstanding command list. */ ++ cnt = ha->current_outstanding_cmd; ++ for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { ++ cnt++; ++ if (cnt == MAX_OUTSTANDING_COMMANDS) ++ cnt = 1; ++ ++ if (ha->outstanding_cmds[cnt] == 0) { ++ found = 1; ++ ha->current_outstanding_cmd = cnt; ++ break; ++ } ++ } ++ ++ /* If room for request in request ring. */ ++ if (found && (req_cnt + 2) < ha->req_q_cnt) { ++ pkt = ha->request_ring_ptr; ++ ++ /* Zero out packet. */ ++ dword_ptr = (uint32_t *)pkt; ++ for (i = 0; i < REQUEST_ENTRY_SIZE / 4; i++ ) ++ *dword_ptr++ = 0; ++ ++ DEBUG5(printk("%s(): putting sp=%p in " ++ "outstanding_cmds[%x]\n", ++ __func__, ++ sp, cnt)); ++ ++ ha->outstanding_cmds[cnt] = sp; ++ ++ /* save the handle */ ++ CMD_HANDLE(sp->cmd) = (unsigned char *) (u_long) cnt; ++ CMD_SP(sp->cmd) = (void *)sp; ++ ++ ha->req_q_cnt--; ++ pkt->handle = (uint32_t)cnt; ++ ++ /* Set system defined field. */ ++ pkt->sys_define = (uint8_t)ha->req_ring_index; ++ pkt->entry_status = 0; ++ ++ break; ++ } ++ ++ /* Release ring specific lock */ ++ spin_unlock(&ha->hardware_lock); ++ udelay(20); ++ ++ /* Check for pending interrupts. */ ++ qla2x00_poll(ha); ++ ++ spin_lock_irq(&ha->hardware_lock); ++ } ++ if (!pkt) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (pkt); ++} ++ ++/** ++ * qla2x00_isp_cmd() - Modify the request ring pointer. ++ * @ha: HA context ++ * ++ * Note: The caller must hold the hardware lock before calling this routine. ++ */ ++void ++qla2x00_isp_cmd(scsi_qla_host_t *ha) ++{ ++ device_reg_t *reg = ha->iobase; ++ ++ ENTER(__func__); ++ ++ DEBUG5(printk("%s(): IOCB data:\n", __func__)); ++ DEBUG5(qla2x00_dump_buffer( ++ (uint8_t *)ha->request_ring_ptr, REQUEST_ENTRY_SIZE)); ++ ++ /* Adjust ring index. */ ++ ha->req_ring_index++; ++ if (ha->req_ring_index == REQUEST_ENTRY_CNT) { ++ ha->req_ring_index = 0; ++ ha->request_ring_ptr = ha->request_ring; ++ } else ++ ha->request_ring_ptr++; ++ ++ /* Set chip new ring index. */ ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index); ++ ++ LEAVE(__func__); ++} ++ ++// TODO: Complete implementation. ++// TODO: Add support for EXTENDED_IDS. ++#ifdef COMPLETE_IMPLEMENTATION ++ ++/* MAILBOX IOCB stuff */ ++ ++/** ++ * qla2x00_send_login_port_iocb() - Login to a device. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to login to ++ * ++ * This routine will build and send a mailbox IOCB to login to a fabric port. ++ * ++ * The qla2x00_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_send_login_port_iocb(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG2(printk("%s(): port ID: %x\n", ++ __func__, ++ device->port_id[2]<<16 | ++ device->port_id[1]<<8 | ++ device->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ ha->marker_needed = 0; ++ } ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG2(printk("%s(): failed\n", __func__);) ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric login MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_SCSI; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(device->dev_id | ++ (MBC_LOGIN_FABRIC_PORT << 16)); ++ mbxentry->loop_id = device->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16((device->loop_id << 8) | ++ (MBC_NO_PROCESS_LOGIN | ++ MBC_NO_PLOGI_IF_LOGGED_IN)); ++ mbxentry->mb2 = cpu_to_le16(device->port_id[2]); ++ mbxentry->mb3 = cpu_to_le16((device->port_id[1] << 8) | ++ device->port_id[0]); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_send_logout_port_iocb() - Logout an FC device. ++ * @ha: SCSI driver HA context ++ * @device: FC device to logout ++ * ++ * This routine will build and send a mailbox IOCB to logout a fabric port. ++ * ++ * The qla2x00_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_send_logout_port_iocb(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG2(printk("%s(): port ID: %x\n", ++ __func__, ++ device->port_id[2]<<16 | ++ device->port_id[1]<<8 | ++ device->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ ha->marker_needed = 0; ++ } ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG3(printk("%s(): failed\n", __func__);) ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric logout MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_SCSI; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(device->dev_id | ++ (MBC_LOGOUT_FABRIC_PORT << 16)); ++ mbxentry->loop_id = device->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16(device->loop_id << 8); ++ mbxentry->mb2 = __constant_cpu_to_le16(0); ++ mbxentry->mb3 = __constant_cpu_to_le16(0); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_mailbox_iocb_done() - Process an mailbox IOCB completion. ++ * @ha: SCSI driver HA context ++ * @mbxentry: completed mailbox IOCB entry ++ * ++ * This routine is currently used for fabric login and logouts only. ++ */ ++static void ++qla2x00_mailbox_iocb_done(scsi_qla_host_t *ha, struct mbx_entry *mbxentry) ++{ ++ int status; ++ uint16_t cmd; ++ uint16_t index; ++ fcdev *device; ++ ++// FIXME: endianess? ++ /* Parse-out originating mailbox command */ ++ cmd = MSW(mbxentry->handle); ++ ++ DEBUG2(printk("%s: cmd %x, status %x, mb0 %x, mb1 %x, mb2 %x\n", ++ __func__, ++ cmd, ++ mbxentry->status, ++ mbxentry->mb0, ++ mbxentry->mb1, ++ mbxentry->mb2);) ++ ++ /* Get device block pointer */ ++ index = LSW(mbxentry->handle); ++ if (index >= QLLAN_MAX_IP_DEVICES) { ++ /* Bad handle from ISP */ ++ DEBUG3(printk("%s: bad handle from isp\n", __func__);) ++ ++ /* TODO: Cleanup??? */ ++ ++ return; ++ } ++// FIXME FROM HERE!!! ++ ipdev = &ha->ipdev_db[index]; ++ ++ if (cmd == MBC_LOGOUT_FABRIC_PORT) { ++ /* Check fabric logout completion status */ ++ if (/*mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Logout successful -- do nothing */ ++ } ++ else { ++ DEBUG12(printk("%s: fabric logout failed\n", __func__);) ++ } ++ } ++ else { ++ /* Check fabric login completion status */ ++ /* Note: sometimes ISP returns Status=0x30 and MB0=0x4000 */ ++ /* Therefore, only check mb0 for now */ ++ if (/* mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Login successful */ ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (mbxentry->mb0 == MBS_PORT_ID_IN_USE) { ++ /* Different loop ID already assigned to port ID */ ++ /* Use the one that is already assigned */ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ipdev->loop_id = mbxentry->mb1; ++ ++ /* Do logout first and then relogin */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 1); ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else if (mbxentry->mb0 == MBS_LOOP_ID_IN_USE) { ++ /* Loop ID already used for different port ID */ ++ /* Get a new loop ID and reissue login request */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_SUCCESS) { ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else { ++ DEBUG12(printk("%s: out of loop IDs\n", ++ __func__);) ++ ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++ else { ++ /* Login failed, return resources */ ++ DEBUG12(printk("%s: fabric login failed\n", __func__);) ++ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++} ++ ++#endif ++ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_ip.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1769 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/**************************************************************************** ++ Please see revision.notes for revision history. ++*****************************************************************************/ ++ ++static __u8 hwbroadcast_addr[ETH_ALEN] = { [0 ... ETH_ALEN-1] = 0xFF }; ++ ++ ++/** ++ * qla2x00_ip_initialize() - Initialize RISC IP support. ++ * @ha: SCSI driver HA context ++ * ++ * Prior to RISC IP initialization, this routine, if necessary, will reset all ++ * buffers in the receive buffer ring. ++ * ++ * Returns TRUE if the RISC IP initialization succeeds. ++ */ ++static int ++qla2x00_ip_initialize(scsi_qla_host_t *ha) ++{ ++ int i; ++ int status; ++ unsigned long flags; ++ device_reg_t *reg; ++ static mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ struct ip_init_cb *ipinit_cb; ++ dma_addr_t ipinit_cb_dma; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ status = FALSE; ++ ++ /* Initialize IP data in ha */ ++ ha->ipdev_db_top = NULL; ++ ha->ipdev_db_bottom = NULL; ++ ha->ipdev_db_next_free = &ha->ipdev_db[0]; ++ for (i = 0; i < QLLAN_MAX_IP_DEVICES; i++) { ++ ha->ipdev_db[i].index = i; ++ ha->ipdev_db[i].next = &ha->ipdev_db[i+1]; ++ } ++ ha->ipdev_db[QLLAN_MAX_IP_DEVICES-1].next = NULL; ++ ++ /* Reset/pack buffers owned by RISC in receive buffer ring */ ++ if (ha->rec_entries_in != ha->rec_entries_out) { ++ struct buffer_cb *bcb; ++ uint16_t rec_out; ++ struct risc_rec_entry *rec_entry; ++ ++ bcb = ha->receive_buffers; ++ rec_out = ha->rec_entries_out; ++ ++ /* ++ * Must locate all RISC owned buffers and pack them in the ++ * buffer ring. ++ */ ++ /* between IpBufferOut and IpBufferIN */ ++ for (i = 0; i < ha->max_receive_buffers; i++, bcb++) { ++ if (test_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) { ++ /* ++ * Set RISC owned buffer into receive buffer ++ * ring. ++ */ ++ rec_entry = &ha->risc_rec_q[rec_out]; ++ rec_entry->handle = bcb->handle; ++ rec_entry->data_addr_low = ++ LSD(bcb->skb_data_dma); ++ rec_entry->data_addr_high = ++ MSD(bcb->skb_data_dma); ++ if (rec_out < IP_BUFFER_QUEUE_DEPTH - 1) ++ rec_out++; ++ else ++ rec_out = 0; ++ } ++ } ++ ++ /* Verify correct number of RISC owned buffers were found */ ++ if (rec_out != ha->rec_entries_in) { ++ /* Incorrect number of RISC owned buffers?? */ ++ DEBUG12(printk("%s: incorrect number of RISC " ++ "owned buffers, disable IP\n", ++ __func__);) ++ ha->flags.enable_ip = FALSE; ++ return (FALSE); ++ } ++ } ++ ++ /* Init RISC buffer pointer */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ reg = ha->iobase; ++ WRT_REG_WORD(®->mailbox8, ha->rec_entries_in); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ /* Wait for a ready state from the adapter */ ++ while (!ha->init_done || ha->dpc_active) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ); ++ } ++ ++ /* Setup IP initialization control block */ ++ ipinit_cb = pci_alloc_consistent(ha->pdev, ++ sizeof(struct ip_init_cb), ++ &ipinit_cb_dma); ++ if (ipinit_cb) { ++ memset(ipinit_cb, 0, sizeof(struct ip_init_cb)); ++ ipinit_cb->version = IPICB_VERSION; ++ ipinit_cb->firmware_options = ++ __constant_cpu_to_le16( ++ IPICB_OPTION_NO_BROADCAST_FASTPOST | ++ IPICB_OPTION_64BIT_ADDRESSING); ++ ipinit_cb->header_size = cpu_to_le16(ha->header_size); ++ ipinit_cb->mtu = cpu_to_le16((uint16_t)ha->mtu); ++ ipinit_cb->receive_buffer_size = ++ cpu_to_le16((uint16_t)ha->receive_buff_data_size); ++ ipinit_cb->receive_queue_size = ++ __constant_cpu_to_le16(IP_BUFFER_QUEUE_DEPTH); ++ ipinit_cb->low_water_mark = ++ __constant_cpu_to_le16(IPICB_LOW_WATER_MARK); ++ ipinit_cb->receive_queue_addr[0] = ++ cpu_to_le16(LSW(ha->risc_rec_q_dma)); ++ ipinit_cb->receive_queue_addr[1] = ++ cpu_to_le16(MSW(ha->risc_rec_q_dma)); ++ ipinit_cb->receive_queue_addr[2] = ++ cpu_to_le16(LSW(MSD(ha->risc_rec_q_dma))); ++ ipinit_cb->receive_queue_addr[3] = ++ cpu_to_le16(MSW(MSD(ha->risc_rec_q_dma))); ++ ipinit_cb->receive_queue_in = cpu_to_le16(ha->rec_entries_out); ++ ipinit_cb->fast_post_count = ++ __constant_cpu_to_le16(IPICB_FAST_POST_COUNT); ++ ipinit_cb->container_count = ++ __constant_cpu_to_le16(IPICB_BUFFER_CONTAINER_COUNT); ++ ipinit_cb->resource_allocation = ++ __constant_cpu_to_le16(IPICB_IOCB_RESERVE_COUNT); ++ ++ /* Issue mailbox command to initialize IP firmware */ ++ mcp->mb[0] = MBC_INITIALIZE_IP; ++ mcp->mb[2] = MSW(ipinit_cb_dma); ++ mcp->mb[3] = LSW(ipinit_cb_dma); ++ mcp->mb[6] = MSW(MSD(ipinit_cb_dma)); ++ mcp->mb[7] = LSW(MSD(ipinit_cb_dma)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->buf_size = sizeof(struct ip_init_cb); ++ mcp->flags = MBX_DMA_OUT; ++ ++ status = qla2x00_mailbox_command(ha, mcp); ++ if (status == QL_STATUS_SUCCESS) { ++ /* IP initialization successful */ ++ DEBUG12(printk("%s: successful\n", __func__);) ++ ++ ha->flags.enable_ip = TRUE; ++ ++ /* Force database update */ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ ++ /* qla2x00_loop_resync(ha); */ ++ if (ha->dpc_wait && !ha->dpc_active) { ++ up(ha->dpc_wait); ++ } ++ status = TRUE; ++ } ++ else { ++ DEBUG12(printk("%s: MBC_INITIALIZE_IP " ++ "failed %x MB0 %x\n", ++ __func__, ++ status, ++ mcp->mb[0]);) ++ status = FALSE; ++ } ++ pci_free_consistent(ha->pdev, sizeof(struct ip_init_cb), ++ ipinit_cb, ipinit_cb_dma); ++ ++ } ++ else { ++ DEBUG12(printk("%s: memory allocation error\n", __func__);) ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_ip_send_complete() - Handle IP send completion. ++ * @ha: SCSI driver HA context ++ * @handle: handle to completed send_cb ++ * @comp_status: Firmware completion status of send_cb ++ * ++ * Upon cleanup of the internal active-scb queue, the IP driver is notified of ++ * the completion. ++ */ ++static void ++qla2x00_ip_send_complete(scsi_qla_host_t *ha, ++ uint32_t handle, uint16_t comp_status) ++{ ++ struct send_cb *scb; ++ ++ /* Set packet pointer from queue entry handle */ ++ if (handle < MAX_SEND_PACKETS) { ++ scb = ha->active_scb_q[handle]; ++ if (scb) { ++ ha->ipreq_cnt--; ++ ha->active_scb_q[handle] = NULL; ++ ++ scb->comp_status = comp_status; ++ pci_unmap_single(ha->pdev, ++ scb->skb_data_dma, ++ scb->skb->len, ++ PCI_DMA_TODEVICE); ++ ++ /* Return send packet to IP driver */ ++ (*ha->send_completion_routine)(scb); ++ return; ++ } ++ } ++ ++ /* Invalid handle from RISC, reset RISC firmware */ ++ printk(KERN_WARNING ++ "%s: Bad IP send handle %x - aborting ISP\n", ++ __func__, handle); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++} ++ ++/** ++ * qla2x00_ip_receive() - Handle IP receive IOCB. ++ * @ha: SCSI driver HA context ++ * @pkt: RISC IP receive packet ++ * ++ * Upon preparation of one or more buffer_cbs, the IP driver is notified of ++ * the received packet. ++ */ ++static void ++qla2x00_ip_receive(scsi_qla_host_t *ha, response_t *pkt) ++{ ++ uint32_t handle; ++ uint32_t packet_size; ++ uint16_t linked_bcb_cnt; ++ uint32_t rec_data_size; ++ uint16_t comp_status; ++ struct buffer_cb *bcb; ++ struct buffer_cb *nbcb; ++ struct ip_rec_entry *iprec_entry; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ iprec_entry = (struct ip_rec_entry *)pkt; ++ comp_status = le16_to_cpu(iprec_entry->comp_status); ++ ++ /* If split buffer, set header size for 1st buffer */ ++ if (comp_status & IPREC_STATUS_SPLIT_BUFFER) ++ rec_data_size = ha->header_size; ++ else ++ rec_data_size = ha->receive_buff_data_size; ++ ++ handle = iprec_entry->buffer_handles[0]; ++ if (handle >= ha->max_receive_buffers) { ++ /* Invalid handle from RISC, reset RISC firmware */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x (> buffer_count)...Post " ++ "ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ bcb = &ha->receive_buffers[handle]; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) { ++ /* Invalid handle from RISC, reset RISC firmware */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x (!RISC_owned)...Post " ++ "ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ packet_size = le16_to_cpu(iprec_entry->sequence_length); ++ bcb->comp_status = comp_status; ++ bcb->packet_size = packet_size; ++ nbcb = bcb; ++ ++ /* Prepare any linked buffers */ ++ for (linked_bcb_cnt = 1; ; linked_bcb_cnt++) { ++ if (packet_size > rec_data_size) { ++ nbcb->rec_data_size = rec_data_size; ++ packet_size -= rec_data_size; ++ ++ /* ++ * If split buffer, only use header size on 1st buffer ++ */ ++ rec_data_size = ha->receive_buff_data_size; ++ ++ handle = iprec_entry->buffer_handles[linked_bcb_cnt]; ++ if (handle >= ha->max_receive_buffers) { ++ /* ++ * Invalid handle from RISC reset RISC firmware ++ */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x (> " ++ "buffer_count - PS)...Post ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ nbcb->next_bcb = &ha->receive_buffers[handle]; ++ nbcb = nbcb->next_bcb; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, ++ &nbcb->state)) { ++ /* ++ * Invalid handle from RISC reset RISC firmware ++ */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x " ++ "(!RISC_owned - PS)...Post ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ } ++ else { ++ /* Single buffer_cb */ ++ nbcb->rec_data_size = packet_size; ++ nbcb->next_bcb = NULL; ++ break; ++ } ++ } ++ ++ /* Check for incoming ARP packet with matching IP address */ ++ if (le16_to_cpu(iprec_entry->service_class) == 0) { ++ uint8_t port_id[3]; ++ struct ip_device *ipdev; ++ struct packet_header *packethdr; ++ ++ packethdr = (struct packet_header *)bcb->skb_data; ++ ++ /* Scan list of IP devices to see if login needed */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) { ++ if (!memcmp(&ipdev->port_name[2], ++ packethdr->networkh.s.na.addr, ETH_ALEN)) { ++ /* Device already in IP list, skip login */ ++ goto skip_device_login; ++ } ++ } ++ ++ /* Device not in list, need to do login */ ++ port_id[2] = iprec_entry->s_idhigh; ++// FIXME: endianess? ++ port_id[1] = MSB(iprec_entry->s_idlow); ++ port_id[0] = LSB(iprec_entry->s_idlow); ++ ++ /* Make sure its not a local device */ ++ if (port_id[2] == ha->d_id.b.domain && ++ port_id[1] == ha->d_id.b.area) { ++ ++ goto skip_device_login; ++ } ++ ++ if (qla2x00_add_new_ip_device(ha, ++ PUBLIC_LOOP_DEVICE, ++ port_id, ++ packethdr->networkh.s.fcaddr, ++ TRUE, ++ 1) == QL_STATUS_FATAL_ERROR) { ++ ++ /* Fatal error, reinitialize */ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ ++ } ++ ++skip_device_login: ++ ++ /* Pass received packet to IP driver */ ++ bcb->linked_bcb_cnt = linked_bcb_cnt; ++ (*ha->receive_packets_routine)(ha->receive_packets_context, bcb); ++ ++ /* Keep track of RISC buffer pointer (for IP reinit) */ ++ ha->rec_entries_out += linked_bcb_cnt; ++ if (ha->rec_entries_out >= IP_BUFFER_QUEUE_DEPTH) ++ ha->rec_entries_out -= IP_BUFFER_QUEUE_DEPTH; ++} ++ ++/** ++ * qla2x00_ip_receive_fastpost() - Handle IP receive fastpost. ++ * @ha: SCSI driver HA context ++ * @type: RISC fastpost type ++ * ++ * Upon preparation of one or more buffer_cbs, the IP driver is notified of ++ * the received packet. ++ */ ++static void ++qla2x00_ip_receive_fastpost(scsi_qla_host_t *ha, uint16_t type) ++{ ++ uint32_t handle; ++ uint32_t packet_size; ++ uint16_t linked_bcb_cnt; ++ uint32_t rec_data_size; ++ volatile uint16_t *next_mb; ++ device_reg_t *reg = ha->iobase; ++ struct buffer_cb *bcb; ++ struct buffer_cb *nbcb; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ next_mb = ®->mailbox10; ++ ++ /* If split buffer, set header size for 1st buffer */ ++ if (type == MBA_IP_RECEIVE_COMPLETE_SPLIT) ++ rec_data_size = ha->header_size; ++ else ++ rec_data_size = ha->receive_buff_data_size; ++ ++ handle = RD_REG_WORD(next_mb); ++ if (handle >= ha->max_receive_buffers) { ++ goto invalid_handle; ++ } ++ ++ bcb = &ha->receive_buffers[handle]; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) { ++ goto invalid_handle; ++ } ++ ++ packet_size = RD_REG_WORD(®->mailbox3); ++ /* Fastpost entries are always successfully transferred */ ++ bcb->comp_status = CS_COMPLETE; ++ bcb->packet_size = packet_size; ++ nbcb = bcb; ++ ++ /* Prepare any linked buffers */ ++ for (linked_bcb_cnt = 1; ; linked_bcb_cnt++) { ++ if (packet_size > rec_data_size) { ++ nbcb->rec_data_size = rec_data_size; ++ packet_size -= rec_data_size; ++ /* ++ * If split buffer, only use header size on 1st buffer ++ */ ++ rec_data_size = ha->receive_buff_data_size; ++ ++ next_mb++; ++ handle = RD_REG_WORD(next_mb); ++ if (handle >= ha->max_receive_buffers) { ++invalid_handle: ++ printk(KERN_WARNING ++ "%s: bad IP receive fast post handle " ++ "%x\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ nbcb->next_bcb = &ha->receive_buffers[handle]; ++ nbcb = nbcb->next_bcb; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, ++ &nbcb->state)) { ++ goto invalid_handle; ++ } ++ } ++ else { ++ /* Single buffer_cb */ ++ nbcb->rec_data_size = packet_size; ++ nbcb->next_bcb = NULL; ++ break; ++ } ++ } ++ ++ /* Pass received packet to IP driver */ ++ bcb->linked_bcb_cnt = linked_bcb_cnt; ++ (*ha->receive_packets_routine)(ha->receive_packets_context, bcb); ++ ++ /* Keep track of RISC buffer pointer (for IP reinit) */ ++ ha->rec_entries_out += linked_bcb_cnt; ++ if (ha->rec_entries_out >= IP_BUFFER_QUEUE_DEPTH) ++ ha->rec_entries_out -= IP_BUFFER_QUEUE_DEPTH; ++} ++ ++/** ++ * qla2x00_convert_to_arp() - Convert an IP send packet to an ARP packet ++ * @ha: SCSI driver HA context ++ * @scb: The send_cb structure to convert ++ * ++ * Returns TRUE if conversion successful. ++ */ ++static int ++qla2x00_convert_to_arp(scsi_qla_host_t *ha, struct send_cb *scb) ++{ ++ struct sk_buff *skb; ++ struct packet_header *packethdr; ++ struct arp_header *arphdr; ++ struct ip_header *iphdr; ++ ++ DEBUG12(printk("%s: convert packet to ARP\n", __func__);) ++ ++ skb = scb->skb; ++ packethdr = scb->header; ++ arphdr = (struct arp_header *)skb->data; ++ iphdr = (struct ip_header *)skb->data; ++ ++ if (packethdr->snaph.ethertype == __constant_htons(ETH_P_IP)) { ++ /* Convert IP packet to ARP packet */ ++ packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE; ++ packethdr->networkh.d.na.unused = 0; ++ memcpy(packethdr->networkh.d.na.addr, ++ hwbroadcast_addr, ETH_ALEN); ++ packethdr->snaph.ethertype = __constant_htons(ETH_P_ARP); ++ ++ arphdr->ar_tip = iphdr->iph.daddr; ++ arphdr->ar_sip = iphdr->iph.saddr; ++ arphdr->arph.ar_hrd = __constant_htons(ARPHRD_IEEE802); ++ arphdr->arph.ar_pro = __constant_htons(ETH_P_IP); ++ arphdr->arph.ar_hln = ETH_ALEN; ++ arphdr->arph.ar_pln = sizeof(iphdr->iph.daddr); /* 4 */ ++ arphdr->arph.ar_op = __constant_htons(ARPOP_REQUEST); ++ memcpy(arphdr->ar_sha, packethdr->networkh.s.na.addr, ETH_ALEN); ++ memset(arphdr->ar_tha, 0, ETH_ALEN); ++ ++ skb->len = sizeof(struct arp_header); ++ ++ return (TRUE); ++ } ++ else { ++ return (FALSE); ++ } ++} ++ ++/** ++ * qla2x00_get_ip_loopid() - Retrieve loop id of an IP device. ++ * @ha: SCSI driver HA context ++ * @packethdr: IP device to remove ++ * @loop_id: loop id of discovered device ++ * ++ * This routine will interrogate the packet header to determine if the sender is ++ * in the list of active IP devices. The first two bytes of the destination ++ * address will be modified to match the port name stored in the active IP ++ * device list. ++ * ++ * Returns TRUE if a valid loop id is returned. ++ */ ++static int ++qla2x00_get_ip_loopid(scsi_qla_host_t *ha, ++ struct packet_header *packethdr, uint8_t *loop_id) ++{ ++ struct ip_device *ipdev; ++ ++ /* Scan list of logged in IP devices for match */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) { ++ if (memcmp(&ipdev->port_name[2], ++ &(packethdr->networkh.d.fcaddr[2]), ETH_ALEN)) ++ continue; ++ ++ /* Found match, return loop ID */ ++ *loop_id = (uint8_t)ipdev->loop_id; ++ ++ /* Update first 2 bytes of port name */ ++ packethdr->networkh.d.fcaddr[0] = ipdev->port_name[0]; ++ packethdr->networkh.d.fcaddr[1] = ipdev->port_name[1]; ++ ++ if (ipdev != ha->ipdev_db_top) { ++ /* Device not at top, move it to top of list */ ++ /* Unhook it first */ ++ if (ipdev == ha->ipdev_db_bottom) { ++ ha->ipdev_db_bottom = ipdev->last; ++ ipdev->last->next = NULL; ++ } ++ else { ++ ipdev->last->next = ipdev->next; ++ ipdev->next->last = ipdev->last; ++ } ++ ++ /* Now put it at top of list */ ++ ipdev->next = ha->ipdev_db_top; ++ ipdev->last = NULL; ++ ha->ipdev_db_top->last = ipdev; ++ ha->ipdev_db_top = ipdev; ++ } ++ return (TRUE); ++ } ++ ++ /* Check for broadcast packet */ ++ if (!memcmp(packethdr->networkh.d.na.addr, ++ hwbroadcast_addr, ETH_ALEN)) { ++ /* Broadcast packet, return broadcast loop ID */ ++ *loop_id = BROADCAST; ++ ++ /* Update destination NAA of header */ ++ packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE; ++ packethdr->networkh.d.na.unused = 0; ++ ++ return (TRUE); ++ } ++ ++ /* Check for multicast packet */ ++ if (packethdr->networkh.d.na.addr[0] & 0x01) { ++ /* Use broadcast loop ID for multicast packets */ ++ *loop_id = BROADCAST; ++ ++ /* Update destination NAA of header */ ++ packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE; ++ packethdr->networkh.d.na.unused = 0; ++ ++ return (TRUE); ++ } ++ ++ /* TODO */ ++ /* Try sending FARP IOCB to request login */ ++ ++ DEBUG12(printk("%s: ID not found for " ++ "XX XX %02x %02x %02x %02x %02x %02x\n", ++ __func__, ++ packethdr->networkh.d.na.addr[0], ++ packethdr->networkh.d.na.addr[1], ++ packethdr->networkh.d.na.addr[2], ++ packethdr->networkh.d.na.addr[3], ++ packethdr->networkh.d.na.addr[4], ++ packethdr->networkh.d.na.addr[5]);) ++ ++ return (FALSE); ++} ++ ++/** ++ * qla2x00_reserve_loopid() - Reserve an unused public loop id. ++ * @ha: SCSI driver HA context ++ * @loop_id: loop id reserved ++ * ++ * Returns QL_STATUS_SUCCESS if a valid loop id is returned. ++ */ ++static int ++qla2x00_reserve_loopid(scsi_qla_host_t *ha, uint16_t *loop_id) ++{ ++ int i; ++ ++ /* Look for unused loop ID */ ++ for (i = ha->min_external_loopid; i < ha->max_public_loop_ids; i++) { ++ if (ha->fabricid[i].in_use) ++ continue; ++ ++ /* Found free loop ID */ ++ ha->fabricid[i].in_use = TRUE; ++ *loop_id = i; ++ ++ DEBUG12(printk("%s: assigned loop ID %x\n", ++ __func__, ++ *loop_id);) ++ ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ /* Out of loop IDs */ ++ *loop_id = ha->max_public_loop_ids + 1; /* Set out of range */ ++ ++ DEBUG12(printk("%s: out of loop IDs\n", __func__);) ++ ++ return (QL_STATUS_RESOURCE_ERROR); ++} ++ ++/** ++ * qla2x00_free_loopid() - Free a public loop id. ++ * @ha: SCSI driver HA context ++ * @loop_id: loop id to free ++ */ ++static void ++qla2x00_free_loopid(scsi_qla_host_t *ha, uint16_t loop_id) ++{ ++ if (loop_id < ha->max_public_loop_ids) { ++ ha->fabricid[loop_id].in_use = FALSE; ++ DEBUG12(printk("%s: free loop ID %x\n", ++ __func__, ++ loop_id);) ++ } ++ else { ++ DEBUG12(printk("%s: loop ID %x out of range\n", ++ __func__, ++ loop_id);) ++ } ++} ++ ++ ++/** ++ * qla2x00_add_new_ip_device() - Add a new IP capable device to the list. ++ * @ha: SCSI driver HA context ++ * @loop_id: loop id, if a private loop, of the new device ++ * @port_id: port id of the new device ++ * @port_name: port name of the new device ++ * @force_add: should the function force the addition of the device ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * Prior to RISC IP initialization, this routine, if necessary, will reset all ++ * buffers in the receive buffer ring. ++ * ++ * Returns QL_STATUS_SUCCESS if there were no errors adding the device. ++ */ ++static int ++qla2x00_add_new_ip_device(scsi_qla_host_t *ha, ++ uint16_t loop_id, ++ uint8_t *port_id, ++ uint8_t *port_name, ++ int force_add, ++ uint32_t ha_locked) ++{ ++ int status; ++ struct ip_device *ipdev; ++ ++ /* Get free IP device block */ ++ status = qla2x00_reserve_ip_block(ha, &ipdev); ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ if (!force_add) ++ return (status); ++ ++ /* ++ * Out of IP blocks, bump public device at bottom of list ++ */ ++ DEBUG12(printk("%s: bump device from IP list\n", __func__);) ++ ++ for (ipdev = ha->ipdev_db_bottom; ipdev; ipdev = ipdev->last) { ++ if (!(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) ++ continue; ++ ++ /* Do fabric logout and free loop ID */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, ha_locked); ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ++ /* Move device to top of list */ ++ qla2x00_free_ip_block(ha, ipdev); ++ status = qla2x00_reserve_ip_block(ha, &ipdev); ++ break; ++ } ++ if (status != QL_STATUS_SUCCESS) ++ return (status); ++ } ++ ++ /* Save IP port name */ ++ memcpy(ipdev->port_name, port_name, WWN_SIZE); ++ ++ if (loop_id != PUBLIC_LOOP_DEVICE) { ++ /* Private loop device */ ++ ipdev->loop_id = loop_id; ++ ipdev->flags = IP_DEV_FLAG_PRESENT; ++ ++ DEBUG12(printk("%s: WWN:%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "LoopID:%x\n", ++ __func__, ++ ipdev->port_name[0], ++ ipdev->port_name[1], ++ ipdev->port_name[2], ++ ipdev->port_name[3], ++ ipdev->port_name[4], ++ ipdev->port_name[5], ++ ipdev->port_name[6], ++ ipdev->port_name[7], ++ ipdev->loop_id);) ++ } ++ else { ++ /* Public device */ ++ /* Reserve public loop ID, save it in database */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ struct ip_device *ipdev_bump; ++ ++ if (!force_add) { ++ /* Failed to get loop ID */ ++ DEBUG12(printk("%s: failed to get loop ID\n", ++ __func__);) ++ qla2x00_free_ip_block(ha, ipdev); ++ ++ return (status); ++ } ++ ++ /* ++ * Out of loop IDs, bump public device at bottom of ++ * list. ++ */ ++ DEBUG12(printk("%s: bump device from IP list\n", ++ __func__);) ++ ++ for (ipdev_bump = ha->ipdev_db_bottom; ++ ipdev_bump; ++ ipdev_bump = ipdev_bump->last) { ++ ++ if (!(ipdev_bump->flags & ++ IP_DEV_FLAG_PUBLIC_DEVICE)) ++ continue; ++ ++ /* ++ * Do fabric logout, steal loop ID, free bumped ++ * IP block. ++ */ ++ qla2x00_ip_send_logout_port_iocb(ha, ++ ipdev_bump, ha_locked); ++ ipdev->loop_id = ipdev_bump->loop_id; ++ qla2x00_free_ip_block(ha, ipdev_bump); ++ ++ status = QL_STATUS_SUCCESS; ++ break; ++ } ++ ++ if (status != QL_STATUS_SUCCESS) { ++ /* Failed to get loop ID */ ++ DEBUG12(printk("%s: failed to get loop ID\n", ++ __func__);) ++ qla2x00_free_ip_block(ha, ipdev); ++ ++ return (status); ++ } ++ } ++ ++ /* Save device data */ ++ ipdev->port_id[0] = port_id[0]; ++ ipdev->port_id[1] = port_id[1]; ++ ipdev->port_id[2] = port_id[2]; ++ ipdev->flags = IP_DEV_FLAG_PUBLIC_DEVICE; ++ ++ /* Login public device */ ++ status = qla2x00_ip_send_login_port_iocb(ha, ipdev, ha_locked); ++ if (status == QL_STATUS_SUCCESS) { ++ DEBUG12(printk("%s: " ++ "WWN:%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "LoopID:%x, PortID:%x\n", ++ __func__, ++ ipdev->port_name[0], ++ ipdev->port_name[1], ++ ipdev->port_name[2], ++ ipdev->port_name[3], ++ ipdev->port_name[4], ++ ipdev->port_name[5], ++ ipdev->port_name[6], ++ ipdev->port_name[7], ++ ipdev->loop_id, ++ ipdev->port_id[2]<<16 | ++ ipdev->port_id[1]<<8 | ++ ipdev->port_id[0]);) ++ } ++ else { ++ /* Login failed, return resources */ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_free_ip_block() - Remove an IP device from the active IP list. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to remove ++ */ ++static void ++qla2x00_free_ip_block(scsi_qla_host_t *ha, struct ip_device *ipdev) ++{ ++ /* Unhook IP device block from active list */ ++ if (ipdev->last == NULL) ++ ha->ipdev_db_top = ipdev->next; ++ else ++ ipdev->last->next = ipdev->next; ++ ++ if (ipdev->next == NULL) ++ ha->ipdev_db_bottom = ipdev->last; ++ else ++ ipdev->next->last = ipdev->last; ++ ++ /* Add IP device block to free list */ ++ ipdev->next = ha->ipdev_db_next_free; ++ ha->ipdev_db_next_free = ipdev; ++} ++ ++/** ++ * qla2x00_reserve_ip_block() - Move an IP device to the IP device list. ++ * @ha: SCSI driver HA context ++ * @ipdevblk: reserved IP device to add ++ * ++ * This routine will move the unused @ipdevblk from the free list to the top of ++ * the active IP device list. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_reserve_ip_block(scsi_qla_host_t *ha, struct ip_device **ipdevblk) ++{ ++ struct ip_device *ipdev; ++ ++ /* Get free IP device block */ ++ ipdev = ha->ipdev_db_next_free; ++ if (ipdev) { ++ /* Remove IP device block from free list */ ++ ha->ipdev_db_next_free = ipdev->next; ++ ++ /* Add IP device block to top of IP device list */ ++ ipdev->next = ha->ipdev_db_top; ++ ipdev->last = NULL; ++ if (ha->ipdev_db_top == NULL) ++ ha->ipdev_db_bottom = ipdev; ++ else ++ ha->ipdev_db_top->last = ipdev; ++ ha->ipdev_db_top = ipdev; ++ ++ *ipdevblk = ipdev; ++ ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ /* Out of IP blocks */ ++ DEBUG12(printk("%s: out of IP blocks\n", __func__);) ++ ++ return (QL_STATUS_RESOURCE_ERROR); ++} ++ ++/** ++ * qla2x00_update_ip_device_data() - Update IP device list with driver data. ++ * @ha: SCSI driver HA context ++ * @fcdev: SCSI driver FC device list ++ * ++ * This routine searchs for the device port name in the current IP database and ++ * updates the IP device list. ++ * ++ * If device found: ++ * - Handle device movement between public and private loops ++ * - Mark device present ++ * - Log in device if necessary ++ * If device not found and private loop device: ++ * - Insert the new entry in database ++ * If device not found and public IP device: ++ * - Ignore device until packet received from device ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_update_ip_device_data(scsi_qla_host_t *ha, fcdev_t *fcdev) ++{ ++ int status; ++ struct ip_device *ipdev; ++ ++ status = 0; ++ ++ if (!ha->flags.enable_ip) { ++ /* IP not enabled, just return */ ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ /* Scan list of IP devices for match */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) { ++ if (memcmp(fcdev->wwn, ipdev->port_name, WWN_SIZE)) ++ continue; ++ ++ /* Found device in IP device list */ ++ DEBUG12(printk("%s: already in IP list, port ID: %x\n", ++ __func__, ++ ipdev->port_id[2] << 16 | ++ ipdev->port_id[1] << 8 | ++ ipdev->port_id[0]);) ++ ++ if (fcdev->flag != DEV_PUBLIC && ++ !(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) { ++ /* ++ * Device on private loop now, was on private loop ++ * before. ++ */ ++ DEBUG12(printk("%s: was private loop, now " ++ "private loop\n", ++ __func__);) ++ ++ /* Update private loop ID in database */ ++ ipdev->loop_id = fcdev->loop_id; ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (fcdev->flag != DEV_PUBLIC && ++ (ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) { ++ /* ++ * Device on private loop now, was public device before. ++ */ ++ DEBUG12(printk("%s: was public, now private loop\n", ++ __func__);) ++ ++ /* ++ * If loop ID changed, logout device and free loop ID. ++ */ ++ if (fcdev->loop_id != ipdev->loop_id) { ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 0); ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ++ /* ++ * Clear public device flag and save private ++ * loop ID in database. ++ */ ++ ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE; ++ ipdev->loop_id = fcdev->loop_id; ++ } ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (fcdev->flag == DEV_PUBLIC && ++ !(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) { ++ /* ++ * Device public now, was on private loop before. ++ */ ++ DEBUG12(printk("%s: was private loop, now public\n", ++ __func__);) ++ ++ /* ++ * Reserve public loop ID, save it in database. ++ */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_SUCCESS) { ++ /* ++ * Save port ID and set public device flag. ++ */ ++ ipdev->port_id[0] = fcdev->d_id.r.d_id[0]; ++ ipdev->port_id[1] = fcdev->d_id.r.d_id[1]; ++ ipdev->port_id[2] = fcdev->d_id.r.d_id[2]; ++ ipdev->flags |= IP_DEV_FLAG_PUBLIC_DEVICE; ++ ++ /* Login public device */ ++ status = qla2x00_ip_send_login_port_iocb(ha, ++ ipdev, 0); ++ } ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ /* Out of loop IDs */ ++ ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE; ++ } ++ } ++ else { ++ /* ++ * Device public now, was public device before. ++ */ ++ DEBUG12(printk("%s: was public, now public\n", ++ __func__);) ++ ++ /* Check if port ID changed */ ++ if (ipdev->port_id[0] != fcdev->d_id.r.d_id[0] || ++ ipdev->port_id[1] != fcdev->d_id.r.d_id[1] || ++ ipdev->port_id[2] != fcdev->d_id.r.d_id[2]) { ++ ++ /* Save new port ID */ ++ ipdev->port_id[0] = fcdev->d_id.r.d_id[0]; ++ ipdev->port_id[1] = fcdev->d_id.r.d_id[1]; ++ ipdev->port_id[2] = fcdev->d_id.r.d_id[2]; ++ ++ DEBUG12(printk("%s: Port ID changed\n", ++ __func__);) ++ ++ /* Logout public device */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 0); ++ } ++ ++ /* Login public device */ ++ status = qla2x00_ip_send_login_port_iocb(ha, ipdev, 0); ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ /* Out of loop IDs */ ++ ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE; ++ } ++ } ++ return (status); ++ } ++ ++ /* Device not found in database */ ++ DEBUG12(printk("%s: device NOT in list\n", __func__);) ++ ++ /* If private loop device, add device to IP list */ ++ /* Public devices will be added as needed when packet received */ ++ if (fcdev->flag != DEV_PUBLIC) { ++ /* Add (force) new private loop device to IP list */ ++ status = qla2x00_add_new_ip_device(ha, ++ fcdev->loop_id, ++ NULL, ++ fcdev->wwn, ++ TRUE, ++ 0); ++ } ++ ++ /* The following code is temporary, until FARP supported */ ++ /* Login all IP public devices for now */ ++ if (fcdev->flag == DEV_PUBLIC) { ++ /* Add (don't force) new public device to IP list */ ++ status = qla2x00_add_new_ip_device(ha, ++ PUBLIC_LOOP_DEVICE, ++ (uint8_t *)&fcdev->d_id, ++ fcdev->wwn, ++ FALSE, ++ 0); ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_ip_send_login_port_iocb() - Login to an IP device. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to login to ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * This routine will build and send a mailbox IOCB to login to a fabric port. ++ * ++ * The qla2x00_ip_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_ip_send_login_port_iocb(scsi_qla_host_t *ha, ++ struct ip_device *ipdev, uint32_t ha_locked) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG12(printk("%s: port ID: %x\n", ++ __func__, ++ ipdev->port_id[2]<<16 | ++ ipdev->port_id[1]<<8 | ++ ipdev->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (ha_locked) { ++ if(__qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ else { ++ if(qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ if (!ha_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG12(printk("%s: failed\n", __func__);) ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric login MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_IP; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(ipdev->index | ++ (MBC_LOGIN_FABRIC_PORT << 16)); ++ mbxentry->loop_id = ipdev->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16((ipdev->loop_id << 8) | ++ (MBC_NO_PROCESS_LOGIN | ++ MBC_NO_PLOGI_IF_LOGGED_IN)); ++ mbxentry->mb2 = cpu_to_le16(ipdev->port_id[2]); ++ mbxentry->mb3 = cpu_to_le16((ipdev->port_id[1] << 8) | ++ ipdev->port_id[0]); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_ip_send_logout_port_iocb() - Logout an IP device. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to logout ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * This routine will build and send a mailbox IOCB to logout a fabric port. ++ * ++ * The qla2x00_ip_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_ip_send_logout_port_iocb(scsi_qla_host_t *ha, ++ struct ip_device *ipdev, uint32_t ha_locked) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG12(printk("%s: port ID: %x\n", ++ __func__, ++ ipdev->port_id[2]<<16 | ++ ipdev->port_id[1]<<8 | ++ ipdev->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (ha_locked) { ++ if(__qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ else { ++ if(qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ if (!ha_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG12(printk("%s: failed\n", __func__);) ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric logout MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_IP; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(ipdev->index | ++ (MBC_LOGOUT_FABRIC_PORT << 16)); ++ mbxentry->loop_id = ipdev->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16(ipdev->loop_id << 8); ++ mbxentry->mb2 = __constant_cpu_to_le16(0); ++ mbxentry->mb3 = __constant_cpu_to_le16(0); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_ip_mailbox_iocb_done() - Process an mailbox IOCB completion. ++ * @ha: SCSI driver HA context ++ * @mbxentry: completed mailbox IOCB entry ++ * ++ * This routine is currently used for fabric login and logouts only. ++ */ ++static void ++qla2x00_ip_mailbox_iocb_done(scsi_qla_host_t *ha, struct mbx_entry *mbxentry) ++{ ++ int status; ++ uint16_t cmd; ++ uint16_t index; ++ struct ip_device *ipdev; ++// FIXME: endianess? ++ /* Parse-out originating mailbox command */ ++ cmd = MSW(mbxentry->handle); ++ ++ DEBUG12(printk("%s: cmd %x, status %x, mb0 %x, mb1 %x, mb2 %x\n", ++ __func__, ++ cmd, ++ mbxentry->status, ++ mbxentry->mb0, ++ mbxentry->mb1, ++ mbxentry->mb2);) ++ ++ /* Get device block pointer */ ++ index = LSW(mbxentry->handle); ++ if (index >= QLLAN_MAX_IP_DEVICES) { ++ /* Bad handle from ISP */ ++ DEBUG12(printk("%s: bad handle from isp\n", __func__);) ++ ++ /* TODO: Cleanup??? */ ++ ++ return; ++ } ++ ++ ipdev = &ha->ipdev_db[index]; ++ ++ if (cmd == MBC_LOGOUT_FABRIC_PORT) { ++ /* Check fabric logout completion status */ ++ if (/*mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Logout successful -- do nothing */ ++ } ++ else { ++ DEBUG12(printk("%s: fabric logout failed\n", __func__);) ++ } ++ } ++ else { ++ /* Check fabric login completion status */ ++ /* Note: sometimes ISP returns Status=0x30 and MB0=0x4000 */ ++ /* Therefore, only check mb0 for now */ ++ if (/* mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Login successful */ ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (mbxentry->mb0 == MBS_PORT_ID_IN_USE) { ++ /* Different loop ID already assigned to port ID */ ++ /* Use the one that is already assigned */ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ipdev->loop_id = mbxentry->mb1; ++ ++ /* Do logout first and then relogin */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 1); ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else if (mbxentry->mb0 == MBS_LOOP_ID_IN_USE) { ++ /* Loop ID already used for different port ID */ ++ /* Get a new loop ID and reissue login request */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_SUCCESS) { ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else { ++ DEBUG12(printk("%s: out of loop IDs\n", ++ __func__);) ++ ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++ else { ++ /* Login failed, return resources */ ++ DEBUG12(printk("%s: fabric login failed\n", __func__);) ++ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++} ++ ++ ++/** ++ * qla2x00_ip_inquiry() - Discover IP-capable adapters. ++ * @adapter_num: adapter number to check (instance) ++ * @inq_data: return bd_inquiry data of the discovered adapter ++ * ++ * This routine is called by the IP driver to discover adapters that support IP ++ * and to get adapter parameters from the SCSI driver. ++ * ++ * Returns TRUE if the specified adapter supports IP. ++ */ ++#if defined (ISP2200) ++int ++qla2200_ip_inquiry(uint16_t adapter_num, struct bd_inquiry *inq_data) ++#elif defined(ISP2300) ++int ++qla2300_ip_inquiry(uint16_t adapter_num, struct bd_inquiry *inq_data) ++#endif ++{ ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ /* Verify structure size and version */ ++ if ((inq_data->length != BDI_LENGTH) || ++ (inq_data->version != BDI_VERSION)) { ++ ++ DEBUG12(printk("%s: incompatable structure\n", __func__);) ++ return (FALSE); ++ } ++ ++ /* Find the specified host adapter */ ++ ha = NULL; ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (ha->instance == adapter_num) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (found) { ++ if (!ha->flags.online) ++ return (FALSE); ++ ++ DEBUG12(printk("%s: found adapter %d\n", ++ __func__, ++ adapter_num);) ++ ++ /* Return inquiry data to backdoor IP driver */ ++ set_bit(BDI_IP_SUPPORT, &inq_data->options); ++ if (ha->flags.enable_64bit_addressing) ++ set_bit(BDI_64BIT_ADDRESSING, &inq_data->options); ++ inq_data->ha = ha; ++ inq_data->risc_rec_q = ha->risc_rec_q; ++ inq_data->risc_rec_q_size = IP_BUFFER_QUEUE_DEPTH; ++ inq_data->link_speed = ha->current_speed; ++ memcpy(inq_data->port_name, ha->ip_port_name, WWN_SIZE); ++ inq_data->pdev = ha->pdev; ++ inq_data->ip_enable_routine = qla2x00_ip_enable; ++ inq_data->ip_disable_routine = qla2x00_ip_disable; ++ inq_data->ip_add_buffers_routine = qla2x00_add_buffers; ++ inq_data->ip_send_packet_routine = qla2x00_send_packet; ++ inq_data->ip_tx_timeout_routine = qla2x00_tx_timeout; ++ return (TRUE); ++ } ++ return (FALSE); ++} ++ ++/** ++ * qla2x00_ip_enable() - Create IP-driver/SCSI-driver IP connection. ++ * @ha: SCSI driver HA context ++ * @enable_data: bd_enable data describing the IP connection ++ * ++ * This routine is called by the IP driver to enable an IP connection to the ++ * SCSI driver and to pass in IP driver parameters. ++ * ++ * The HA context is propagated with the specified @enable_data and the ++ * Firmware is initialized for IP support. ++ * ++ * Returns TRUE if the IP connection was successfully enabled. ++ */ ++static int ++qla2x00_ip_enable(scsi_qla_host_t *ha, struct bd_enable *enable_data) ++{ ++ int status; ++ ++ DEBUG12(printk("%s: enable adapter %d\n", __func__, (int)ha->host_no);) ++ ++ status = FALSE; ++ ++ /* Verify structure size and version and adapter online */ ++ if (!(ha->flags.online) || ++ (enable_data->length != BDE_LENGTH) || ++ (enable_data->version != BDE_VERSION)) { ++ ++ DEBUG12(printk("%s: incompatable structure or offline\n", ++ __func__);) ++ return (status); ++ } ++ ++ /* Save parameters from IP driver */ ++ ha->mtu = enable_data->mtu; ++ ha->header_size = enable_data->header_size; ++ ha->receive_buffers = enable_data->receive_buffers; ++ ha->max_receive_buffers = enable_data->max_receive_buffers; ++ ha->receive_buff_data_size = enable_data->receive_buff_data_size; ++ if (test_bit(BDE_NOTIFY_ROUTINE, &enable_data->options)) { ++ ha->notify_routine = enable_data->notify_routine; ++ ha->notify_context = enable_data->notify_context; ++ } ++ ha->send_completion_routine = enable_data->send_completion_routine; ++ ha->receive_packets_routine = enable_data->receive_packets_routine; ++ ha->receive_packets_context = enable_data->receive_packets_context; ++ ++ /* Enable RISC IP support */ ++ status = qla2x00_ip_initialize(ha); ++ if (!status) { ++ DEBUG12(printk("%s: IP initialization failed", __func__);) ++ ha->notify_routine = NULL; ++ } ++ return (status); ++} ++ ++/** ++ * qla2x00_ip_disable() - Remove IP-driver/SCSI-driver IP connection. ++ * @ha: SCSI driver HA context ++ * ++ * This routine is called by the IP driver to disable a previously created IP ++ * connection. ++ * ++ * A Firmware call to disable IP support is issued. ++ */ ++static void ++qla2x00_ip_disable(scsi_qla_host_t *ha) ++{ ++ int rval; ++ static mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG12(printk("%s: disable adapter %d\n", __func__, (int)ha->host_no);) ++ ++ /* Wait for a ready state from the adapter */ ++ while (!ha->init_done || ha->dpc_active) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ); ++ } ++ ++ /* Disable IP support */ ++ ha->flags.enable_ip = FALSE; ++ ++ mcp->mb[0] = MBC_DISABLE_IP; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ if (rval == QL_STATUS_SUCCESS) { ++ /* IP disabled successful */ ++ DEBUG12(printk(KERN_INFO ++ "%s: successful\n", __func__);) ++ } ++ else { ++ DEBUG12(printk(KERN_WARNING ++ "%s: MBC_DISABLE_IP failed\n", __func__);) ++ } ++ ++ /* Reset IP parameters */ ++ ha->rec_entries_in = 0; ++ ha->rec_entries_out = 0; ++ ha->notify_routine = NULL; ++} ++ ++/** ++ * qla2x00_add_buffers() - Adds buffers to the receive buffer queue. ++ * @ha: SCSI driver HA context ++ * @rec_count: The number of receive buffers to add to the queue ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * This routine is called by the IP driver to pass new buffers to the receive ++ * buffer queue. ++ */ ++static void ++qla2x00_add_buffers(scsi_qla_host_t *ha, uint16_t rec_count, int ha_locked) ++{ ++ int i; ++ uint16_t rec_in; ++ uint16_t handle; ++ unsigned long flags = 0; ++ device_reg_t *reg; ++ struct risc_rec_entry *risc_rec_q; ++ struct buffer_cb *bcbs; ++ ++ flags = 0; ++ risc_rec_q = ha->risc_rec_q; ++ rec_in = ha->rec_entries_in; ++ bcbs = ha->receive_buffers; ++ ++ /* Set RISC owns buffer flag on new entries */ ++ for (i = 0; i < rec_count; i++) { ++ handle = risc_rec_q[rec_in].handle; ++ set_bit(BCB_RISC_OWNS_BUFFER, &(bcbs[handle].state)); ++ if (rec_in < IP_BUFFER_QUEUE_DEPTH - 1) ++ rec_in++; ++ else ++ rec_in = 0; ++ } ++ ++ /* Update RISC buffer pointer */ ++ if (!ha_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ reg = ha->iobase; ++ WRT_REG_WORD(®->mailbox8, rec_in); ++ ha->rec_entries_in = rec_in; ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++ ++/** ++ * qla2x00_send_packet() - Transmit a send_cb. ++ * @ha: SCSI driver HA context ++ * @scb: The send_cb structure to send ++ * ++ * This routine is called by the IP driver to pass @scb (IP packet) to the ISP ++ * for transmission. ++ * ++ * Returns QL_STATUS_SUCCESS if @scb was sent, QL_STATUS_RESOURCE_ERROR if the ++ * RISC was too busy to send, or QL_STATUS_ERROR. ++ */ ++static int ++qla2x00_send_packet(scsi_qla_host_t *ha, struct send_cb *scb) ++{ ++ int i; ++ uint16_t cnt; ++ uint16_t temp; ++ uint32_t handle; ++ unsigned long flags; ++ struct ip_cmd_entry *ipcmd_entry; ++ struct sk_buff *skb; ++ device_reg_t *reg; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ skb = scb->skb; ++ reg = ha->iobase; ++ ++ /* Check adapter state */ ++ if (!ha->flags.online) { ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if(qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) { ++ printk(KERN_WARNING ++ "%s: Unable to issue marker.\n", ++ __func__); ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ /* Acquire ring specific lock */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ if (ha->req_q_cnt < 4) { ++ /* Update number of free request entries */ ++ cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg)); ++ if (ha->req_ring_index < cnt) ++ ha->req_q_cnt = cnt - ha->req_ring_index; ++ else ++ ha->req_q_cnt = REQUEST_ENTRY_CNT - ++ (ha->req_ring_index - cnt); ++ } ++ ++ if (ha->req_q_cnt >= 4) { ++ /* Get tag handle for command */ ++ handle = ha->current_scb_q_idx; ++ for (i = 0; i < MAX_SEND_PACKETS; i++) { ++ handle++; ++ if (handle == MAX_SEND_PACKETS) ++ handle = 0; ++ if (ha->active_scb_q[handle] == NULL) { ++ ha->current_scb_q_idx = handle; ++ goto found_handle; ++ } ++ } ++ } ++ ++ /* Low on resources, try again later */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ printk(KERN_WARNING ++ "%s: Low on resources, try again later...\n", ++ __func__); ++ ++ return (QL_STATUS_RESOURCE_ERROR); ++ ++found_handle: ++ ++ /* Build ISP command packet */ ++ ipcmd_entry = (struct ip_cmd_entry *)ha->request_ring_ptr; ++ ++ /* OPTIMIZATION ??? */ ++ /* Throughput increases an additional 10 Mbps with the following code */ ++ *((uint32_t *)(&ipcmd_entry->entry_type)) = ++ __constant_cpu_to_le32(ET_IP_COMMAND_64 | (1 << 8)); ++ //ipcmd_entry->entry_type = ET_IP_COMMAND_64; ++ //ipcmd_entry->entry_count = 1; ++ //ipcmd_entry->sys_define = 0; ++ //ipcmd_entry->entry_status = 0; ++ ++ ipcmd_entry->handle = handle; ++ ipcmd_entry->reserved_1 = 0; ++ ++ /* Get destination loop ID for packet */ ++ if (!qla2x00_get_ip_loopid(ha, scb->header, &ipcmd_entry->loop_id)) { ++ /* Failed to get loop ID, convert packet to ARP */ ++ if (qla2x00_convert_to_arp(ha, scb)) { ++ /* Broadcast ARP */ ++ ipcmd_entry->loop_id = BROADCAST; ++ } ++ else { ++ /* Return packet */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ printk(KERN_WARNING ++ "%s: Unable to determine loop id for " ++ "destination.\n", ++ __func__); ++ return (QL_STATUS_ERROR); ++ } ++ } ++ ++ /* Default five second firmware timeout */ ++ ipcmd_entry->timeout = __constant_cpu_to_le16(5); ++ ipcmd_entry->control_flags = __constant_cpu_to_le16(CF_WRITE); ++ ipcmd_entry->reserved_2 = 0; ++ ipcmd_entry->service_class = __constant_cpu_to_le16(0); ++ ++ ipcmd_entry->data_seg_count = __constant_cpu_to_le16(2); ++ ipcmd_entry->ds.data_segs64[0].address[0] = ++ cpu_to_le32(LSD(scb->header_dma)); ++ ipcmd_entry->ds.data_segs64[0].address[1] = ++ cpu_to_le32(MSD(scb->header_dma)); ++ ipcmd_entry->ds.data_segs64[0].length = ++ __constant_cpu_to_le32(sizeof(struct packet_header)); ++ scb->skb_data_dma = pci_map_single(ha->pdev, ++ skb->data, skb->len, ++ PCI_DMA_TODEVICE); ++ ipcmd_entry->ds.data_segs64[1].address[0] = ++ cpu_to_le32(LSD(scb->skb_data_dma)); ++ ipcmd_entry->ds.data_segs64[1].address[1] = ++ cpu_to_le32(MSD(scb->skb_data_dma)); ++ ipcmd_entry->ds.data_segs64[1].length = cpu_to_le32(skb->len); ++ ++ ipcmd_entry->byte_count = ++ cpu_to_le32(skb->len + sizeof(struct packet_header)); ++ ++ /* Adjust ring index. */ ++ ha->req_ring_index++; ++ if (ha->req_ring_index == REQUEST_ENTRY_CNT) { ++ ha->req_ring_index = 0; ++ ha->request_ring_ptr = ha->request_ring; ++ } else ++ ha->request_ring_ptr++; ++ ++ ha->ipreq_cnt++; ++ ha->req_q_cnt--; ++ ha->active_scb_q[handle] = scb; ++ ++ /* Set chip new ring index. */ ++ temp = CACHE_FLUSH(ISP_REQ_Q_IN(reg)); ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_tx_timeout() - Handle transmission timeout. ++ * @ha: SCSI driver HA context ++ * ++ * This routine is called by the IP driver to handle packet transmission ++ * timeouts. ++ * ++ * Returns QL_STATUS_SUCCESS if timeout handling completed successfully. ++ */ ++static int ++qla2x00_tx_timeout(scsi_qla_host_t *ha) ++{ ++ /* TODO: complete interface */ ++ ++ /* Reset RISC firmware for basic recovery */ ++ printk(KERN_WARNING ++ "%s: A transmission timeout occured - aborting ISP\n", ++ __func__); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ ++ return (QL_STATUS_SUCCESS); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_ip.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,420 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 IP network driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/**************************************************************************** ++ Please see revision.notes for revision history. ++*****************************************************************************/ ++ ++#if !defined(_QLA_IP_H_) ++#define _QLA_IP_H_ ++ ++#define MAX_SEND_PACKETS 32 /* Maximum # send packets */ ++#define MAX_RECEIVE_BUFFERS 64 /* Maximum # receive buffers */ ++#define MIN_RECEIVE_BUFFERS 8 /* Minimum # receive buffers */ ++#define IP_BUFFER_QUEUE_DEPTH (MAX_RECEIVE_BUFFERS+1) ++ ++/* Async notification types */ ++#define NOTIFY_EVENT_LINK_DOWN 1 /* Link went down */ ++#define NOTIFY_EVENT_LINK_UP 2 /* Link is back up */ ++#define NOTIFY_EVENT_RESET_DETECTED 3 /* Reset detected */ ++ ++/* QLogic subroutine status definitions */ ++#define QL_STATUS_SUCCESS 0 ++#define QL_STATUS_ERROR 1 ++#define QL_STATUS_FATAL_ERROR 2 ++#define QL_STATUS_RESOURCE_ERROR 3 ++#define QL_STATUS_LOOP_ID_IN_USE 4 ++#define QL_STATUS_NO_DATA 5 ++ ++/************************************************************************/ ++/* RFC 2625 -- networking structure definitions */ ++/************************************************************************/ ++ ++/* Network header definitions */ ++struct network_address ++{ ++#if defined(__LITTLE_ENDIAN_BITFIELD) ++ __u16 unused:12, ++ naa:4; ++#elif defined (__BIG_ENDIAN_BITFIELD) ++ __u16 naa:4, ++ unused:12; ++#else ++#error "Please fix <asm/byteorder.h>" ++#endif ++ ++#define NAA_IEEE_MAC_TYPE 1 /* NAA code - IEEE MAC addr */ ++ ++ __u8 addr[6]; ++}; ++ ++struct network_header ++{ ++ union ++ { ++ struct network_address na; ++ __u8 fcaddr[8]; ++ } d; ++ ++ union ++ { ++ struct network_address na; ++ __u8 fcaddr[8]; ++ } s; ++}; ++ ++/* SNAP header definitions */ ++/* from linux/if_fc.h */ ++struct snap_header ++{ ++ __u8 dsap; /* destination SAP */ ++ __u8 ssap; /* source SAP */ ++#define LLC_SAP_IEEE_802DOT2 0xAA /* LLC SAP code - IEEE 802.2 */ ++ ++ __u8 llc; /* LLC control field */ ++#define LLC_CONTROL 0x03 /* LLC control code */ ++ ++ __u8 protid[3]; /* protocol id */ ++#define SNAP_OUI 0x00 /* SNAP OUI code */ ++ ++ __u16 ethertype; /* ether type field */ ++}; ++ ++/* Packet header definitions */ ++struct packet_header ++{ ++ struct network_header networkh; ++ struct snap_header snaph; ++}; ++ ++/* ARP header definitions */ ++/* from linux/if_arp.h */ ++struct arp_header ++{ ++ struct arphdr arph; ++ __u8 ar_sha[ETH_ALEN]; /* sender hardware address */ ++ __u32 ar_sip; /* sender IP address */ ++ __u8 ar_tha[ETH_ALEN]; /* target hardware address */ ++ __u32 ar_tip; /* target IP address */ ++}; ++ ++/* IP header definitions */ ++struct ip_header ++{ ++ struct iphdr iph; ++ __u32 options; /* IP packet options */ ++}; ++ ++ ++/************************************************************************/ ++/* Support structures. */ ++/************************************************************************/ ++ ++/* Definitions for IP support */ ++#define LOOP_ID_MASK 0x00FF ++#define PLE_NOT_SCSI_DEVICE 0x8000 /* Upper bit of loop ID set */ ++ /* if not SCSI */ ++ ++/* Receive buffer control block definitions */ ++struct buffer_cb ++{ ++ uint16_t handle; /* ISP buffer handle */ ++ uint16_t comp_status; /* completion status from FW */ ++ ++ uint32_t state; /* Buffer CB state */ ++#define BCB_RISC_OWNS_BUFFER 1 ++ ++ struct sk_buff *skb; /* Socket buffer */ ++ uint8_t *skb_data; /* Socket buffer data */ ++ dma_addr_t skb_data_dma; /* SKB data physical address */ ++ uint32_t rec_data_size; /* Size of received data */ ++ uint32_t packet_size; /* Size of packet received */ ++ ++ uint16_t linked_bcb_cnt; /* # of linked CBs for packet */ ++ uint16_t unused2; ++ struct buffer_cb *next_bcb; /* Next buffer CB */ ++}; ++ ++/* Send control block definitions */ ++struct send_cb ++{ ++ uint16_t comp_status; /* completion status from FW */ ++#define SCB_CS_COMPLETE 0x0 ++#define SCB_CS_INCOMPLETE 0x1 ++#define SCB_CS_RESET 0x4 ++#define SCB_CS_ABORTED 0x5 ++#define SCB_CS_TIMEOUT 0x6 ++#define SCB_CS_PORT_UNAVAILABLE 0x28 ++#define SCB_CS_PORT_LOGGED_OUT 0x29 ++#define SCB_CS_PORT_CONFIG_CHG 0x2A ++#define SCB_CS_FW_RESOURCE_UNAVAILABLE 0x2C ++ ++ uint16_t unused1; ++ ++ void *qdev; /* netdev private structure */ ++ ++ struct packet_header *header; /* Network and SNAP headers */ ++ dma_addr_t header_dma; /* Header physical address */ ++ ++ struct sk_buff *skb; /* socket buffer to send */ ++ dma_addr_t skb_data_dma; /* skb data physical address */ ++}; ++ ++/* IP device data structure */ ++#define QLLAN_MAX_IP_DEVICES 64 /* Maximum number of IP devices */ ++ ++struct ip_device ++{ ++ uint16_t index; ++ uint16_t unused1; ++ ++ uint32_t flags; ++#define IP_DEV_FLAG_PRESENT 0x00000001 ++#define IP_DEV_FLAG_PUBLIC_DEVICE 0x00000002 ++ ++ uint16_t loop_id; ++#define PUBLIC_LOOP_DEVICE ((uint16_t)-1) ++ ++ uint16_t unused2; ++ uint8_t port_id[3]; ++ uint8_t unused3; ++ uint8_t port_name[8]; ++ ++ struct ip_device *next; ++ struct ip_device *last; ++}; ++ ++/************************************************************************/ ++/* Definitions for Backdoor Inquiry. */ ++/************************************************************************/ ++ ++struct bd_inquiry ++{ ++ uint16_t length; /* Length of structure */ ++#define BDI_LENGTH sizeof(struct bd_inquiry) ++ ++ uint16_t version; /* Structure version number */ ++/* NOTE: Update this value anytime the structure changes */ ++#define BDI_VERSION 2 ++ ++ /* Exports */ ++ uint32_t options; /* supported options */ ++#define BDI_IP_SUPPORT 1 /* IP supported */ ++#define BDI_64BIT_ADDRESSING 2 /* 64bit address supported */ ++ ++ void *ha; /* Driver ha pointer */ ++ void *risc_rec_q; /* RISC receive queue */ ++ uint16_t risc_rec_q_size; /* size */ ++ ++ uint16_t link_speed; /* Current link speed */ ++#define BDI_1GBIT_PORTSPEED 1 /* operating at 1GBIT */ ++#define BDI_2GBIT_PORTSPEED 2 /* operating at 2GBIT */ ++#define BDI_10GBIT_PORTSPEED 4 /* operating at 10GBIT */ ++ ++ uint8_t port_name[8]; /* Adapter port name */ ++ ++ struct pci_dev *pdev; /* PCI device information */ ++ ++ /* Pointers to SCSI-backdoor callbacks */ ++ void *ip_enable_routine; ++ void *ip_disable_routine; ++ void *ip_add_buffers_routine; ++ void *ip_send_packet_routine; ++ void *ip_tx_timeout_routine; ++ ++ uint32_t unused2[9]; ++}; ++ ++/************************************************************************/ ++/* Definitions for Backdoor Enable. */ ++/************************************************************************/ ++ ++struct bd_enable ++{ ++ uint16_t length; /* Length of structure */ ++#define BDE_LENGTH sizeof(struct bd_enable) ++ ++ uint16_t version; /* Structure version number */ ++/* NOTE: Update this value anytime the structure changes */ ++#define BDE_VERSION 2 ++ ++ /* Imports */ ++ uint32_t options; /* supported options */ ++#define BDE_NOTIFY_ROUTINE 1 /* notify routine imported */ ++ ++ uint32_t mtu; /* maximum transfer size */ ++ uint16_t header_size; /* split header size */ ++ uint16_t unused1; ++ ++ void *receive_buffers; /* receive buffers array */ ++ uint16_t max_receive_buffers; /* max # receive buffers */ ++ uint16_t unused2; ++ uint32_t receive_buff_data_size; /* buffer size */ ++ ++ /* Pointers to IP-backdoor callbacks */ ++ void *notify_routine; ++ void *notify_context; ++ void *send_completion_routine; ++ void *receive_packets_routine; ++ void *receive_packets_context; ++ ++ uint32_t unused3[9]; ++}; ++ ++ ++/************************************************************************/ ++/* RISC interface structures */ ++/************************************************************************/ ++ ++/* IP mailbox commands */ ++#define MBC_INITIALIZE_IP 0x0077 ++#define MBC_DISABLE_IP 0x0079 ++ ++/* IP async events */ ++#define MBA_IP_TRANSMIT_COMPLETE 0x8022 ++#define MBA_IP_RECEIVE_COMPLETE 0x8023 ++#define MBA_IP_BROADCAST_RECEIVED 0x8024 ++#define MBA_IP_RECEIVE_BUFFERS_LOW 0x8025 ++#define MBA_IP_OUT_OF_BUFFERS 0x8026 ++#define MBA_IP_RECEIVE_COMPLETE_SPLIT 0x8027 ++ ++/* IP fast post completions for 2300 */ ++#define RHS_IP_SEND_COMPLETE 0x18 ++#define RHS_IP_RECV_COMPLETE 0x19 ++#define RHS_IP_RECV_DA_COMPLETE 0x1B ++ ++/* RISC IP receive buffer queue entry structure */ ++struct risc_rec_entry ++{ ++ uint32_t data_addr_low; ++ uint32_t data_addr_high; ++ uint16_t handle; ++ uint16_t unused; ++}; ++ ++/* Firmware IP initialization control block definitions */ ++struct ip_init_cb ++{ ++ uint8_t version; ++#define IPICB_VERSION 0x01 ++ ++ uint8_t reserved_1; ++ ++ uint16_t firmware_options; ++#define IPICB_OPTION_64BIT_ADDRESSING 0x0001 ++#define IPICB_OPTION_NO_BROADCAST_FASTPOST 0x0002 ++#define IPICB_OPTION_OUT_OF_BUFFERS_EVENT 0x0004 ++ ++ uint16_t header_size; ++ uint16_t mtu; ++ uint16_t receive_buffer_size; ++ uint16_t reserved_2; ++ uint16_t reserved_3; ++ uint16_t reserved_4; ++ uint16_t reserved_5; ++ ++ uint16_t receive_queue_size; ++ uint16_t low_water_mark; ++#define IPICB_LOW_WATER_MARK 0 ++ ++ uint16_t receive_queue_addr[4]; ++ uint16_t receive_queue_in; ++ uint16_t fast_post_count; ++#define IPICB_FAST_POST_COUNT 4 ++ ++ uint16_t container_count; ++#define IPICB_BUFFER_CONTAINER_COUNT 64 ++ ++ uint16_t resource_allocation; ++#define IPICB_IOCB_RESERVE_COUNT 250 ++}; ++ ++ ++/* IP IOCB types */ ++ ++/* Data segment descriptor structures */ ++struct data_seg ++{ ++ uint32_t address; ++ uint32_t length; ++}; ++ ++struct data_seg_a64 ++{ ++ uint32_t address[2]; ++ uint32_t length; ++}; ++ ++/* IP Command IOCB structure */ ++struct ip_cmd_entry ++{ ++ uint8_t entry_type; ++#define ET_IP_COMMAND_32 0x13 ++#define ET_IP_COMMAND_64 0x1B ++ ++ uint8_t entry_count; ++ uint8_t sys_define; ++ uint8_t entry_status; ++ ++ uint32_t handle; ++ uint8_t reserved_1; ++ uint8_t loop_id; ++ uint16_t comp_status; ++ uint16_t control_flags; ++ uint16_t reserved_2; ++ uint16_t timeout; ++ uint16_t data_seg_count; ++ uint16_t service_class; ++ uint16_t reserved_3[7]; ++ uint32_t byte_count; ++ union ++ { ++ struct data_seg data_segs[3]; ++ struct data_seg_a64 data_segs64[2]; ++ } ds; ++}; ++ ++/* IP Receive IOCB structure */ ++#define ET_IP_RECEIVE_CONTINUATION 0x2B ++ ++struct ip_rec_entry ++{ ++ uint8_t entry_type; ++#define ET_IP_RECEIVE 0x23 ++ ++ uint8_t entry_count; ++ uint8_t segment_count; ++ uint8_t entry_status; ++ ++ uint16_t s_idlow; ++ uint8_t s_idhigh; ++ uint8_t reserved_1; ++ uint8_t reserved_2; ++ uint8_t loop_id; ++ uint16_t comp_status; ++#define IPREC_STATUS_SPLIT_BUFFER 0x0001 ++ ++ uint16_t service_class; ++ uint16_t sequence_length; ++ ++#define IPREC_MAX_HANDLES 24 ++ uint16_t buffer_handles[IPREC_MAX_HANDLES]; ++}; ++ ++#endif /* _QLA_IP_H_ */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_isr.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1474 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ */ ++ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); ++static void qla2x00_async_event(scsi_qla_host_t *, uint32_t); ++static void qla2x00_process_completed_request(struct scsi_qla_host *, int); ++static void qla2x00_response_pkt(scsi_qla_host_t *, uint16_t); ++static void qla2x00_status_entry(scsi_qla_host_t *, sts_entry_t *); ++static void qla2x00_status_cont_entry(scsi_qla_host_t *, sts_cont_entry_t *); ++static void qla2x00_error_entry(scsi_qla_host_t *, response_t *); ++static void qla2x00_ms_entry(scsi_qla_host_t *, ms_iocb_entry_t *); ++ ++static int qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *); ++ ++/** ++ * qla2x00_intr_handler() - Process interrupts for the ISP. ++ * @irq: ++ * @dev_id: SCSI driver HA context ++ * @regs: ++ * ++ * Called by system whenever the host adapter generates an interrupt. ++ * ++ * Returns handled flag. ++ */ ++irqreturn_t ++qla2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) ++{ ++ scsi_qla_host_t *ha; ++ device_reg_t *reg; ++ uint32_t mbx; ++ uint16_t stat; ++ int status = 0; ++ unsigned long flags = 0; ++ unsigned long mbx_flags = 0; ++ unsigned long intr_iter; ++ ++ /* Don't loop forever, interrupt are OFF */ ++ intr_iter = 50; ++ ++ ha = (scsi_qla_host_t *) dev_id; ++ if (!ha) { ++ printk(KERN_INFO ++ "%s(): NULL host pointer\n", __func__); ++ return (IRQ_NONE); ++ } ++ ++ reg = ha->iobase; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ for (;;) { ++ /* Relax CPU! */ ++ if (!(intr_iter--)) ++ break; ++ ++#if defined(ISP2100) || defined(ISP2200) ++ if ((RD_REG_WORD(®->istatus) & ISR_RISC_INT) == 0) { ++ break; ++ } ++ ++ if (RD_REG_WORD(®->semaphore) & BIT_0) { ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ ++ /* Get mailbox data. */ ++ mbx = RD_REG_WORD(®->mailbox0); ++ if (mbx > 0x3fff && mbx < 0x8000) { ++ qla2x00_mbx_completion(ha, (uint16_t)mbx); ++ status |= MBX_INTERRUPT; ++ } else if (mbx > 0x7fff && mbx < 0xc000) { ++ qla2x00_async_event(ha, mbx); ++ } else { ++ /*EMPTY*/ ++ DEBUG2(printk("scsi(%ld): Unrecognized " ++ "interrupt type (%d)\n", ++ ha->host_no, mbx)); ++ } ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ } else { ++ stat = RD_REG_WORD(®->mailbox5); ++ qla2x00_response_pkt(ha, stat); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++#else /* ISP2300 */ ++ if ((ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) && ++ (RD_REG_WORD(®->istatus) & ISR_RISC_INT) == 0) { ++ break; ++ } ++ ++ stat = RD_REG_WORD(®->host_status_lo); ++ if ((stat & HSR_INT) == 0) { ++ break; ++ } ++ if (stat & HSR_RISC_PAUSED) { ++ uint16_t hccr; ++ ++ hccr = RD_REG_WORD(®->hccr); ++ printk(KERN_INFO ++ "scsi(%ld): RISC paused, dumping HCCR (%x)\n", ++ ha->host_no, ++ hccr); ++ ++ /* ++ * Issue a "HARD" reset in order for the RISC interrupt ++ * bit to be cleared. Schedule a big hammmer to get ++ * out of the RISC PAUSED state. ++ */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ } ++ mbx = RD_REG_WORD(®->host_status_hi); ++ switch (stat & 0xff) { ++ case 0x1: ++ case 0x2: ++ case 0x10: ++ case 0x11: ++ qla2x00_mbx_completion(ha, (uint16_t)mbx); ++ status |= MBX_INTERRUPT; ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ break; ++ case 0x12: ++ qla2x00_async_event(ha, mbx); ++ break; ++ case 0x13: ++ qla2x00_response_pkt(ha, (uint16_t)mbx); ++ break; ++ case 0x16: ++ mbx = mbx << 16 | MBA_SCSI_COMPLETION; ++ qla2x00_async_event(ha, mbx); ++ break; ++#if defined(FC_IP_SUPPORT) ++ case 0x18: ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ qla2x00_ip_send_complete(ha, mbx, CS_COMPLETE); ++ continue; ++ break; ++ case 0x19: ++ qla2x00_ip_receive_fastpost(ha, ++ MBA_IP_RECEIVE_COMPLETE); ++ break; ++ case 0x1b: ++ qla2x00_ip_receive_fastpost(ha, ++ MBA_IP_RECEIVE_COMPLETE_SPLIT); ++ break; ++#endif ++ default: ++ DEBUG2(printk("scsi(%ld): Unrecognized interrupt type " ++ "(%d)\n", ++ ha->host_no, stat & 0xff)); ++ break; ++ } ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++#endif ++ } ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ ha->total_isr_cnt++; ++ ++ if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && ++ (status & MBX_INTERRUPT) && ha->flags.mbox_int) { ++ ++ /* There was a mailbox completion */ ++ DEBUG3(printk("%s(%ld): Going to get mbx reg lock.\n", ++ __func__, ha->host_no)); ++ ++ QLA_MBX_REG_LOCK(ha); ++ ++ MBOX_TRACE(ha, BIT_5); ++ if (ha->mcp == NULL) { ++ DEBUG3(printk("%s(%ld): Error mbx pointer.\n", ++ __func__, ha->host_no)); ++ } else { ++ DEBUG3(printk("%s(%ld): Going to set mbx intr flags. " ++ "cmd=%x.\n", ++ __func__, ha->host_no, ha->mcp->mb[0])); ++ } ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ DEBUG3(printk("%s(%ld): Going to wake up mbx function for " ++ "completion.\n", ++ __func__, ha->host_no)); ++ ++ MBOX_TRACE(ha,BIT_6); ++ up(&ha->mbx_intr_sem); ++ ++ DEBUG3(printk("%s(%ld): Going to release mbx reg lock.\n", ++ __func__, ha->host_no)); ++ QLA_MBX_REG_UNLOCK(ha); ++ } ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ /* Wakeup the DPC routine */ ++ if ((!ha->flags.mbox_busy && ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || ++ test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) || ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))) && ++ ha->dpc_wait && !ha->dpc_active) { ++ ++ up(ha->dpc_wait); ++ } ++ ++ return (IRQ_HANDLED); ++} ++ ++/** ++ * qla2x00_mbx_completion() - Process mailbox command completions. ++ * @ha: SCSI driver HA context ++ * @mb0: Mailbox0 register ++ */ ++static void ++qla2x00_mbx_completion(scsi_qla_host_t *ha, uint16_t mb0) ++{ ++ uint16_t cnt; ++ uint16_t *wptr; ++ device_reg_t *reg = ha->iobase; ++ ++ ENTER(__func__); ++ ++ /* Load return mailbox registers. */ ++ ha->flags.mbox_int = TRUE; ++ ha->mailbox_out[0] = mb0; ++ wptr = (uint16_t *)®->mailbox1; ++ ++ for (cnt = 1; cnt < MAILBOX_REGISTER_COUNT; cnt++) { ++#if defined(ISP2200) ++ if (cnt == 8) ++ wptr = (uint16_t *)®->mailbox8; ++#endif ++ if (cnt == 4 || cnt == 5) ++ ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr); ++ else ++ ha->mailbox_out[cnt] = RD_REG_WORD(wptr); ++ ++ wptr++; ++ } ++ ++ if (ha->mcp) { ++ DEBUG3(printk("%s(%ld): Got mailbox completion. cmd=%x.\n", ++ __func__, ha->host_no, ha->mcp->mb[0])); ++ } else { ++ DEBUG2_3(printk("%s(%ld): MBX pointer ERROR!\n", ++ __func__, ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_async_event() - Process aynchronous events. ++ * @ha: SCSI driver HA context ++ * @mb0: Mailbox0 register ++ */ ++static void ++qla2x00_async_event(scsi_qla_host_t *ha, uint32_t mbx) ++{ ++ uint32_t index; ++ uint16_t mb[4]; ++ device_reg_t *reg = ha->iobase; ++ uint8_t rscn_queue_index; ++ ++ ENTER(__func__); ++ ++ /* Setup to process completions */ ++ mb[0] = LSW(mbx); ++ switch(mb[0]) { ++ case MBA_SCSI_COMPLETION: /* Fast Post */ ++#if defined(ISP2100) || defined(ISP2200) ++ mb[1] = RD_REG_WORD(®->mailbox1); ++#else ++ mb[1] = MSW(mbx); ++#endif ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ ++ DEBUG5(printk("%s(): mailbox response completion.\n", ++ __func__)); ++ ++ if (!ha->flags.online) ++ break; ++ ++ /* Get outstanding command index */ ++ index = (uint32_t)(mb[2] << 16 | mb[1]); ++ qla2x00_process_completed_request(ha, index); ++ break; ++ ++#if defined(FC_IP_SUPPORT) ++ case MBA_IP_TRANSMIT_COMPLETE: /* IP Completion */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ qla2x00_ip_send_complete(ha, mb[1], CS_COMPLETE); ++ break; ++ ++ case MBA_IP__RECEIVE_COMPLETE: ++ case MBA_IP_RECEIVE_COMPLETE_SPLIT: ++ qla2x00_ip_receive_fastpost(ha, mb[0]); ++ break; ++#endif /* FC_IP_SUPPORT */ ++ ++ case MBA_RESET: /* Reset */ ++ DEBUG2(printk("scsi(%ld): Asynchronous RESET.\n", ha->host_no)); ++ ++ set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_SYSTEM_ERR: /* System Error */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ mb[3] = RD_REG_WORD(®->mailbox3); ++ ++ printk(KERN_INFO ++ "scsi(%ld): ISP System Error - mbx1=%xh mbx2=%xh " ++ "mbx3=%xh.\n", ++ ha->host_no, mb[1], mb[2], mb[3]); ++ ++ qla2x00_dump_isp(ha, 1); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_REQ_TRANSFER_ERR: /* Request Transfer Error */ ++ DEBUG2(printk("scsi(%ld): ISP Request Transfer Error.\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): ISP Request Transfer Error.\n", ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_RSP_TRANSFER_ERR: /* Response Transfer Error */ ++ DEBUG2(printk("scsi(%ld): ISP Response Transfer Error.\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): ISP Response Transfer Error.\n", ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ ++ DEBUG2(printk("scsi(%ld): Asynchronous WAKEUP_THRES.\n", ++ ha->host_no)); ++ break; ++ ++ case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous LIP Occured.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Asynchronous LIP Occured.\n", ha->host_no); ++ ++ /* Save LIP sequence. */ ++ ha->lip_seq = mb[1]; ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ ++ ha->flags.management_server_logged_in = 0; ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LIP_OCCURRED, NULL); ++ } ++ ++ ha->total_lip_cnt++; ++ break; ++ ++ case MBA_LOOP_UP: /* Loop Up Event */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous LOOP UP.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): LOOP UP detected.\n", ha->host_no); ++ ++ ha->flags.management_server_logged_in = 0; ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LOOP_UP, NULL); ++ } ++ ++ /* Save the current speed for use by ioctl and IP driver */ ++ ha->current_speed = EXT_DEF_PORTSPEED_1GBIT; ++#if defined(ISP2300) ++ if (mb[1] == 1) ++ ha->current_speed = EXT_DEF_PORTSPEED_2GBIT; ++#endif ++ break; ++ ++ case MBA_LOOP_DOWN: /* Loop Down Event */ ++ DEBUG2(printk("scsi(%ld): Asynchronous LOOP DOWN.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): LOOP DOWN detected.\n", ha->host_no); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ ha->flags.management_server_logged_in = 0; ++ ha->current_speed = 0; /* reset value */ ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LOOP_DOWN, NULL); ++ } ++ break; ++ ++ case MBA_LIP_RESET: /* LIP reset occurred */ ++ DEBUG2(printk("scsi(%ld): Asynchronous LIP RESET.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): LIP reset occured.\n", ha->host_no); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ++ ha->operating_mode = LOOP; ++ ha->flags.management_server_logged_in = 0; ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LIP_RESET, NULL); ++ } ++ ++ ha->total_lip_cnt++; ++ break; ++ ++#if !defined(ISP2100) ++ case MBA_LINK_MODE_UP: /* Link mode up. */ ++ DEBUG2(printk("scsi(%ld): Asynchronous LINK MODE UP.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Link mode is up.\n", ++ ha->host_no); ++ ++ /* ++ * Until there's a transition from loop down to loop up, treat ++ * this as loop down only. ++ */ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ if (!atomic_read(&ha->loop_down_timer)) ++ atomic_set(&ha->loop_down_timer, ++ LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ } ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_UPDATE_CONFIG: /* Update Configuration. */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous UPDATE CONFIG.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Configuration change detected: value=%x.\n", ++ ha->host_no, mb[1]); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ if (!atomic_read(&ha->loop_down_timer)) ++ atomic_set(&ha->loop_down_timer, ++ LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ break; ++#endif /* #if !defined(ISP2100) */ ++ ++ case MBA_PORT_UPDATE: /* Port database update */ ++ /* ++ * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET ++ * event etc. earlier indicating loop is down) then process ++ * it. Otherwise ignore it and Wait for RSCN to come in. ++ */ ++ if (ha->loop_state != LOOP_DOWN) { ++ DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE " ++ "ignored.\n", ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Asynchronous PORT UPDATE ignored.\n", ++ ha->host_no); ++ break; ++ } ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Port database changed.\n", ha->host_no); ++ ++ /* ++ * Mark all devices as missing so we will login again. ++ */ ++ ha->loop_state = LOOP_UP; ++ ++ atomic_set(&ha->loop_down_timer, 0); ++ qla2x00_mark_all_devices_lost(ha); ++ ++ ha->flags.rscn_queue_overflow = 1; ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_PORT_UPDATE, NULL); ++ } ++ break; ++ ++ case MBA_SCR_UPDATE: /* State Change Registration */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n", ++ ha->host_no)); ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): RSCN database changed - 0x%x, 0x%x.\n", ++ ha->host_no, mb[1], mb[2])); ++ ++ rscn_queue_index = ha->rscn_in_ptr + 1; ++ if (rscn_queue_index == MAX_RSCN_COUNT) ++ rscn_queue_index = 0; ++ if (rscn_queue_index != ha->rscn_out_ptr) { ++ ha->rscn_queue[ha->rscn_in_ptr].format = ++ MSB(mb[1]); ++ ha->rscn_queue[ha->rscn_in_ptr].d_id.b.domain = ++ LSB(mb[1]); ++ ha->rscn_queue[ha->rscn_in_ptr].d_id.b.area = ++ MSB(mb[2]); ++ ha->rscn_queue[ha->rscn_in_ptr].d_id.b.al_pa = ++ LSB(mb[2]); ++ ha->rscn_in_ptr = rscn_queue_index; ++ } else { ++ ha->flags.rscn_queue_overflow = 1; ++ } ++ ++ ha->loop_state = LOOP_UPDATE; ++ atomic_set(&ha->loop_down_timer, 0); ++ ha->flags.management_server_logged_in = 0; ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(RSCN_UPDATE, &ha->dpc_flags); ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_RSCN_UPDATE, &mb[0]); ++ } ++ break; ++ } ++} ++ ++/** ++ * qla2x00_process_completed_request() - Process a Fast Post response. ++ * @ha: SCSI driver HA context ++ * @index: SRB index ++ */ ++static void ++qla2x00_process_completed_request(struct scsi_qla_host *ha, int index) ++{ ++ srb_t *sp; ++ struct scsi_qla_host *vis_ha; ++ ++ ENTER(__func__); ++ ++ /* Validate handle. */ ++ if (index >= MAX_OUTSTANDING_COMMANDS) { ++ DEBUG2(printk("scsi(%ld): Invalid SCSI completion handle %d.\n", ++ ha->host_no, index)); ++ printk(KERN_WARNING ++ "scsi(%ld): Invalid SCSI completion handle %d.\n", ++ ha->host_no, index); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ sp = ha->outstanding_cmds[index]; ++ if (sp) { ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[index] = 0; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ vis_ha = (scsi_qla_host_t *)sp->cmd->device->host->hostdata; ++ if (ha->actthreads) ++ ha->actthreads--; ++ sp->lun_queue->out_cnt--; ++ sp->flags |= SRB_ISP_COMPLETED; ++ CMD_COMPL_STATUS(sp->cmd) = 0L; ++ CMD_SCSI_STATUS(sp->cmd) = 0L; ++ ++ /* Save ISP completion status */ ++ CMD_RESULT(sp->cmd) = DID_OK << 16; ++ sp->fo_retry_cnt = 0; ++ add_to_done_queue(ha, sp); ++ } else { ++ DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Invalid ISP SCSI completion handle\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_response_pkt() - Process response queue entries. ++ * @ha: SCSI driver HA context ++ * @index: Response queue out pointer ++ */ ++static void ++qla2x00_response_pkt(scsi_qla_host_t *ha, uint16_t index) ++{ ++ device_reg_t *reg = ha->iobase; ++ response_t *pkt; ++ ++ ENTER(__func__); ++ ++ if (!ha->flags.online) ++ return; ++ ++ if (index >= RESPONSE_ENTRY_CNT) { ++ /* Invalid response pointer value. */ ++ DEBUG(printk("scsi(%ld): Response Pointer Error - index=%x.\n", ++ ha->host_no, index)); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ while (ha->rsp_ring_index != index) { ++ pkt = ha->response_ring_ptr; ++ ++ DEBUG5(printk("%s(%ld): ha->rsp_ring_index=%ld index=%ld.\n", ++ __func__, ha->host_no, ++ (u_long)ha->rsp_ring_index, (u_long)index)); ++ DEBUG5(printk("%s(%ld): response packet data:", ++ __func__, ha->host_no)); ++ DEBUG5(qla2x00_dump_buffer((uint8_t *)pkt, ++ RESPONSE_ENTRY_SIZE)); ++ ++ ha->rsp_ring_index++; ++ if (ha->rsp_ring_index == RESPONSE_ENTRY_CNT) { ++ ha->rsp_ring_index = 0; ++ ha->response_ring_ptr = ha->response_ring; ++ } else { ++ ha->response_ring_ptr++; ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ /* ++ * This code is temporary until FW is fixed. FW is mistakenly ++ * setting bit 6 on Mailbox IOCB response ++ */ ++ pkt->entry_status &= 0x3f; ++#endif ++ ++ if (pkt->entry_status != 0) { ++ DEBUG3(printk(KERN_INFO ++ "scsi(%ld): Process error entry.\n", ha->host_no)); ++ ++ qla2x00_error_entry(ha, pkt); ++ continue; ++ } ++ ++ switch (pkt->entry_type) { ++ case STATUS_TYPE: ++ qla2x00_status_entry(ha, (sts_entry_t *)pkt); ++ break; ++ ++ case STATUS_CONT_TYPE: ++ qla2x00_status_cont_entry(ha, (sts_cont_entry_t *)pkt); ++ break; ++ ++ case MS_IOCB_TYPE: ++ qla2x00_ms_entry(ha, (ms_iocb_entry_t *)pkt); ++ break; ++ ++#if defined(FC_IP_SUPPORT) ++ case ET_IP_COMMAND_64: ++ /* Handle IP send completion */ ++ qla2x00_ip_send_complete(ha, ++ pkt->handle, le16_to_cpu(pkt->comp_status)); ++ break; ++ ++ case ET_IP_RECEIVE: ++ /* Handle IP receive packet */ ++ qla2x00_ip_receive(ha, pkt); ++ break; ++ ++ case ET_MAILBOX_COMMAND: ++ if (pkt->sys_define == SOURCE_IP) { ++ qla2x00_ip_mailbox_iocb_done(ha, ++ (struct mbx_entry *)pkt); ++ break; ++ } ++#endif /* FC_IP_SUPPORT */ ++ ++ default: ++ /* Type Not Supported. */ ++ DEBUG4(printk(KERN_WARNING ++ "scsi(%ld): Received unknown response pkt type %x " ++ "entry status=%x.\n", ++ ha->host_no, pkt->entry_type, pkt->entry_status)); ++ break; ++ } ++ } ++ ++ /* Adjust ring index */ ++ WRT_REG_WORD(ISP_RSP_Q_OUT(reg), ha->rsp_ring_index); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_status_entry() - Process a Status IOCB entry. ++ * @ha: SCSI driver HA context ++ * @pkt: Entry pointer ++ */ ++static void ++qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt ) ++{ ++ uint32_t b, t, l; ++ scsi_qla_host_t *vis_ha; ++ srb_t *sp; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ fc_port_t *fcport; ++ Scsi_Cmnd *cp; ++ uint16_t comp_status; ++ uint16_t scsi_status; ++ uint8_t lscsi_status; ++ uint32_t resid; ++ uint8_t sense_sz = 0; ++ ++ ++ ENTER(__func__); ++ ++ /* Validate handle. */ ++ if (pkt->handle < MAX_OUTSTANDING_COMMANDS) { ++ sp = ha->outstanding_cmds[pkt->handle]; ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[pkt->handle] = 0; ++ } else ++ sp = NULL; ++ ++ if (sp == NULL) { ++ DEBUG2(printk("scsi(%ld): Status Entry invalid handle.\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Status Entry invalid handle.\n", ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ return; ++ } ++ ++ cp = sp->cmd; ++ if (cp == NULL) { ++ DEBUG2(printk("scsi(%ld): Cmd already returned back to OS " ++ "pkt->handle: %d sp=%p sp->state:%d\n", ++ ha->host_no, pkt->handle, sp, sp->state)); ++ printk(KERN_WARNING ++ "scsi(%ld): Cmd is NULL: already returned to OS (sp=%p)\n", ++ ha->host_no, sp); ++ return; ++ } ++ ++ /* ++ * Set the visible adapter for lun Q access. ++ */ ++ vis_ha = (scsi_qla_host_t *)cp->device->host->hostdata; ++ if (ha->actthreads) ++ ha->actthreads--; ++ ++ if (sp->lun_queue == NULL) { ++ DEBUG2(printk("scsi(%ld): Status Entry invalid lun " ++ "pointer.\n", ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Status Entry invalid lun pointer.\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ return; ++ } ++ ++ sp->lun_queue->out_cnt--; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ ++ comp_status = le16_to_cpu(pkt->comp_status); ++ /* Mask of reserved bits 12-15. Before we examine the scsi status */ ++ scsi_status = le16_to_cpu(pkt->scsi_status) & SS_MASK; ++ lscsi_status = scsi_status & STATUS_MASK; ++ ++ CMD_ENTRY_STATUS(cp) = pkt->entry_status; ++ CMD_COMPL_STATUS(cp) = comp_status; ++ CMD_SCSI_STATUS(cp) = scsi_status; ++ ++ /* dg 10/11 */ ++ sp->flags |= SRB_ISP_COMPLETED; ++ ++ /* Generate LU queue on cntrl, target, LUN */ ++ b = SCSI_BUS_32(cp); ++ t = SCSI_TCN_32(cp); ++ l = SCSI_LUN_32(cp); ++ ++ tq = sp->tgt_queue; ++ lq = sp->lun_queue; ++ ++ /* ++ * If loop is in transient state Report DID_BUS_BUSY ++ */ ++ if (!(sp->flags & SRB_IOCTL) && ++ (atomic_read(&ha->loop_down_timer) || ++ ha->loop_state != LOOP_READY) && ++ (comp_status != CS_COMPLETE || scsi_status != 0)) { ++ ++ DEBUG2(printk("scsi(%ld:%d:%d:%d): Loop Not Ready - " ++ "pid=%lx.\n", ++ ha->host_no, ++ b, t, l, sp->cmd->serial_number)); ++ ++ qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT); ++ add_to_retry_queue(ha, sp); ++ return; ++ } ++ ++ /* ++ * Based on Host and scsi status generate status code for Linux ++ */ ++ switch (comp_status) { ++ case CS_COMPLETE: ++ /* ++ * Host complted command OK. Check SCSI Status to determine ++ * the correct Host status. ++ */ ++ if (scsi_status == 0) { ++ CMD_RESULT(cp) = DID_OK << 16; ++ ++ /* Perform any post command processing */ ++ qla2x00_filter_command(ha, sp); ++ } else { /* Check for non zero scsi status */ ++ if (lscsi_status == SS_BUSY_CONDITION) { ++ CMD_RESULT(cp) = ++ DID_BUS_BUSY << 16 | lscsi_status; ++ } else { ++ CMD_RESULT(cp) = ++ DID_OK << 16 | lscsi_status; ++ ++ if (lscsi_status != SS_CHECK_CONDITION) ++ break; ++ ++ /* ++ * Copy Sense Data into sense buffer ++ */ ++ memset(cp->sense_buffer, ++ 0, sizeof(cp->sense_buffer)); ++ ++ if (!(scsi_status & SS_SENSE_LEN_VALID)) ++ break; ++ ++ if (le16_to_cpu(pkt->req_sense_length) < ++ CMD_SNSLEN(cp)) ++ sense_sz = ++ le16_to_cpu(pkt->req_sense_length); ++ else ++ sense_sz = CMD_SNSLEN(cp) - 1; ++ ++ CMD_ACTUAL_SNSLEN(cp) = sense_sz; ++ sp->request_sense_length = sense_sz; ++ sp->request_sense_ptr = ++ (void *)cp->sense_buffer; ++ ++ if (sp->request_sense_length > 32) ++ sense_sz = 32; ++ ++ memcpy(cp->sense_buffer, ++ pkt->req_sense_data, sense_sz); ++ ++ sp->request_sense_ptr += sense_sz; ++ sp->request_sense_length -= sense_sz; ++ if (sp->request_sense_length != 0) ++ ha->status_srb = sp; ++ ++ if (!(sp->flags & SRB_IOCTL) && ++ qla2x00_check_sense(cp, lq) == ++ QL_STATUS_SUCCESS) { ++ /* ++ * Throw away status_cont if any ++ */ ++ ha->status_srb = NULL; ++ add_to_scsi_retry_queue(ha, sp); ++ return; ++ } ++ ++ DEBUG5(printk("%s(): Check condition Sense " ++ "data, scsi(%ld:%d:%d:%d) cmd=%p " ++ "pid=%ld\n", ++ __func__, ++ ha->host_no, ++ b, t, l, ++ cp, cp->serial_number)); ++ if (sense_sz) ++ DEBUG5(qla2x00_dump_buffer( ++ cp->sense_buffer, ++ CMD_ACTUAL_SNSLEN(cp))); ++ } ++ } ++ break; ++ ++ case CS_DATA_UNDERRUN: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld:%d:%d) UNDERRUN status detected 0x%x-0x%x.\n", ++ ha->host_no, ++ t, l, comp_status, scsi_status)); ++ ++ resid = le32_to_cpu(pkt->residual_length); ++ CMD_RESID_LEN(cp) = resid; ++ ++ /* ++ * Check to see if SCSI Status is non zero. If so report SCSI ++ * Status. ++ */ ++ if (lscsi_status != 0) { ++ if (lscsi_status == SS_BUSY_CONDITION) { ++ CMD_RESULT(cp) = ++ DID_BUS_BUSY << 16 | lscsi_status; ++ } else { ++ CMD_RESULT(cp) = ++ DID_OK << 16 | lscsi_status; ++ ++ if (lscsi_status != SS_CHECK_CONDITION) ++ break; ++ ++ /* ++ * Copy Sense Data into sense buffer ++ */ ++ memset(cp->sense_buffer, ++ 0, sizeof(cp->sense_buffer)); ++ ++ if (!(scsi_status & SS_SENSE_LEN_VALID)) ++ break; ++ ++ if (le16_to_cpu(pkt->req_sense_length) < ++ CMD_SNSLEN(cp)) ++ sense_sz = ++ le16_to_cpu(pkt->req_sense_length); ++ else ++ sense_sz = CMD_SNSLEN(cp) - 1; ++ ++ CMD_ACTUAL_SNSLEN(cp) = sense_sz; ++ sp->request_sense_length = sense_sz; ++ sp->request_sense_ptr = ++ (void *)cp->sense_buffer; ++ ++ if (sp->request_sense_length > 32) ++ sense_sz = 32; ++ ++ memcpy(cp->sense_buffer, ++ pkt->req_sense_data, sense_sz); ++ ++ sp->request_sense_ptr += sense_sz; ++ sp->request_sense_length -= sense_sz; ++ if (sp->request_sense_length != 0) ++ ha->status_srb = sp; ++ ++ if (!(sp->flags & SRB_IOCTL) && ++ (qla2x00_check_sense(cp, lq) == ++ QL_STATUS_SUCCESS)) { ++ ha->status_srb = NULL; ++ add_to_scsi_retry_queue(ha,sp); ++ return; ++ } ++ ++ DEBUG5(printk("%s(): Check condition Sense " ++ "data, scsi(%ld:%d:%d:%d) cmd=%p " ++ "pid=%ld\n", ++ __func__, ++ ha->host_no, ++ b, t, l, ++ cp, cp->serial_number)); ++ if (sense_sz) ++ DEBUG5(qla2x00_dump_buffer( ++ cp->sense_buffer, ++ CMD_ACTUAL_SNSLEN(cp))); ++ } ++ } else { ++ /* ++ * If RISC reports underrun and target does not report ++ * it then we must have a lost frame, so tell upper ++ * layer to retry it by reporting a bus busy. ++ */ ++ if (!(scsi_status & SS_RESIDUAL_UNDER)) { ++ DEBUG2(printk("scsi(%ld:%d:%d:%d) Dropped " ++ "frame(s) detected (%x of %x bytes)..." ++ "retrying command.\n", ++ ha->host_no, ++ b, t, l, resid, CMD_XFRLEN(cp))); ++ ++ CMD_RESULT(cp) = DID_BUS_BUSY << 16; ++ ha->dropped_frame_error_cnt++; ++ break; ++ } ++ ++ /* ++ * Handle mid-layer underflow??? ++ * ++ * For kernels less than 2.4, the driver must return ++ * an error if an underflow is detected. For kernels ++ * equal-to and above 2.4, the mid-layer will ++ * appearantly handle the underflow by detecting the ++ * residual count -- unfortunately, we do not see ++ * where this is actually being done. In the interim, ++ * we will return DID_ERROR. ++ */ ++ cp->resid = resid; ++/* TODO: ++ * ++ * Determine if this is a valid check for 2.5 ++ */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ if ((unsigned)(CMD_XFRLEN(cp) - resid) < ++ cp->underflow) { ++ printk(KERN_INFO ++ "scsi(%ld): Mid-layer underflow detected " ++ "(%x of %x bytes) wanted %x bytes..." ++ "returning DID_ERROR status!\n", ++ ha->host_no, ++ resid, CMD_XFRLEN(cp), cp->underflow); ++ ++ CMD_RESULT(cp) = DID_ERROR << 16; ++ break; ++ } ++#endif ++ /* Everybody online, looking good... */ ++ CMD_RESULT(cp) = DID_OK << 16; ++ ++ /* Perform any post command processing */ ++ qla2x00_filter_command(ha, sp); ++ } ++ break; ++ ++ case CS_PORT_LOGGED_OUT: ++ case CS_PORT_CONFIG_CHG: ++ case CS_PORT_BUSY: ++ case CS_INCOMPLETE: ++ case CS_PORT_UNAVAILABLE: ++ /* ++ * If the port is in Target Down state, return all IOs for this ++ * Target with DID_NO_CONNECT ELSE Queue the IOs in the ++ * retry_queue. ++ */ ++ fcport = lq->fclun->fcport; ++ DEBUG2(printk("scsi(%ld:%d:%d): status_entry: Port Down " ++ "pid=%ld, compl status=0x%x, port state=0x%x\n", ++ ha->host_no, ++ t, l, ++ sp->cmd->serial_number, ++ comp_status, ++ atomic_read(&fcport->state))); ++ ++ if ((sp->flags & SRB_IOCTL) || ++ (atomic_read(&fcport->state) == FC_DEVICE_DEAD)) { ++ CMD_RESULT(cp) = DID_NO_CONNECT << 16; ++ add_to_done_queue(ha, sp); ++ } else { ++ qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT); ++ add_to_retry_queue(ha, sp); ++ } ++ ++ if (atomic_read(&fcport->state) == FC_ONLINE) { ++ qla2x00_mark_device_lost(ha, fcport); ++ } ++ ++ return; ++ break; ++ ++ case CS_RESET: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): RESET status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ ++ if (sp->flags & SRB_IOCTL) { ++ CMD_RESULT(cp) = DID_RESET << 16; ++ } ++ else { ++ qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT); ++ add_to_retry_queue(ha, sp); ++ return; ++ } ++ break; ++ ++ case CS_ABORTED: ++ /* ++ * hv2.19.12 - DID_ABORT does not retry the request if we ++ * aborted this request then abort otherwise it must be a ++ * reset. ++ */ ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): ABORT status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ ++ CMD_RESULT(cp) = DID_RESET << 16; ++ break; ++ ++ case CS_TIMEOUT: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): TIMEOUT status detected 0x%x-0x%x.\n", ++ ha->host_no, ++ b, t, l, ++ comp_status, scsi_status)); ++ ++ CMD_RESULT(cp) = DID_BUS_BUSY << 16; ++ ++ fcport = lq->fclun->fcport; ++// Dump FW ++printk("***TIMEOUT cmd=(%lx) cdb=(%x)\n\n", cp->serial_number, cp->cmnd[0]); ++//qla2x00_dump_isp(ha, 1); ++ ++ /* ++ * Check to see if logout occurred ++ */ ++ t = SCSI_TCN_32(cp); ++ if ((le16_to_cpu(pkt->status_flags) & IOCBSTAT_SF_LOGO)) { ++ DEBUG2(printk("scsi: Timeout occurred with Logo, " ++ "status flag (%x) with public device loop id " ++ "(%x), attempt new recovery\n", ++ le16_to_cpu(pkt->status_flags), ++ ha->fc_db[t].loop_id)); ++ ++ ha->fc_db[t].flag |= DEV_RELOGIN; ++ fcport->login_retry = ha->login_retry_count; ++ set_bit(RELOGIN_NEEDED, &ha->dpc_flags); ++ } ++ break; ++ ++ case CS_QUEUE_FULL: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): QUEUE FULL status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ ++ /* ++ * SCSI Mid-Layer handles device queue full. ++ */ ++ CMD_RESULT(cp) = DID_OK << 16 | lscsi_status; ++ ++/* Adjust queue depth */ ++{ ++int ret; ++ ++ret = scsi_track_queue_full(cp->device, sp->lun_queue->out_cnt-1); ++printk("scsi(%ld:%d:%d:%d): QUEUE FULL adjustments -- " ++ "outstanding/adjusted (%ld/%d) -- qd/lqfd/lqfc (%d/%d/%d).\n", ++ ha->host_no, ++ cp->device->channel, cp->device->id, cp->device->lun, ++ sp->lun_queue->out_cnt-1, ret, ++ cp->device->queue_depth, ++ cp->device->last_queue_full_count, ++ cp->device->last_queue_full_depth); ++} ++ ++ ++ break; ++ ++ default: ++ DEBUG3(printk("scsi(%ld): Error detected (unknown status) " ++ "0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ printk(KERN_INFO ++ "scsi(%ld): Unknown status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status); ++ ++ CMD_RESULT(cp) = DID_ERROR << 16; ++ break; ++ } ++ ++ /* Place command on done queue. */ ++ if (ha->status_srb == NULL) ++ add_to_done_queue(ha, sp); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_status_cont_entry() - Process a Status Continuations entry. ++ * @ha: SCSI driver HA context ++ * @pkt: Entry pointer ++ * ++ * Extended sense data. ++ */ ++static void ++qla2x00_status_cont_entry(scsi_qla_host_t *ha, sts_cont_entry_t *pkt) ++{ ++ uint8_t sense_sz = 0; ++ srb_t *sp = ha->status_srb; ++ Scsi_Cmnd *cp; ++ ++ ENTER(__func__); ++ ++ if (sp != NULL && sp->request_sense_length != 0) { ++ cp = sp->cmd; ++ if (cp == NULL) { ++ DEBUG2(printk("%s(): Cmd already returned back to OS " ++ "sp=%p sp->state:%d\n", ++ __func__, sp, sp->state)); ++ printk(KERN_INFO ++ "%s(): cmd is NULL: already returned to OS " ++ "(sp=%p)\n", ++ __func__, sp); ++ ++ ha->status_srb = NULL; ++ return; ++ } ++ ++ if (sp->request_sense_length > sizeof (pkt->req_sense_data)) { ++ sense_sz = sizeof(pkt->req_sense_data); ++ } else { ++ sense_sz = sp->request_sense_length; ++ } ++ ++ /* Move sense data. */ ++ memcpy(sp->request_sense_ptr, pkt->req_sense_data, sense_sz); ++ DEBUG5(qla2x00_dump_buffer(sp->request_sense_ptr, sense_sz)); ++ ++ sp->request_sense_ptr += sense_sz; ++ sp->request_sense_length -= sense_sz; ++ ++ /* Place command on done queue. */ ++ if (sp->request_sense_length == 0) { ++ add_to_done_queue(ha, sp); ++ ha->status_srb = NULL; ++ } ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_error_entry() - Process an error entry. ++ * @ha: SCSI driver HA context ++ * @pkt: Entry pointer ++ */ ++static void ++qla2x00_error_entry(scsi_qla_host_t *ha, response_t *pkt) ++{ ++ srb_t *sp; ++ ++ ENTER(__func__); ++ ++#if defined(QL_DEBUG_LEVEL_2) ++ if (pkt->entry_status & RF_INV_E_ORDER) ++ printk("%s(%ld): Invalid Entry Order\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_INV_E_COUNT) ++ printk("%s(%ld): Invalid Entry Count\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_INV_E_PARAM) ++ printk("%s(%ld): Invalid Entry Parameter\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_INV_E_TYPE) ++ printk("%s(%ld): Invalid Entry Type\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_BUSY) ++ printk("%s(%ld): Busy\n", ++ __func__, ha->host_no); ++ else ++ printk("%s(%ld): UNKNOWN flag error\n", ++ __func__, ha->host_no); ++#endif ++ ++ /* Validate handle. */ ++ if (pkt->handle < MAX_OUTSTANDING_COMMANDS) ++ sp = ha->outstanding_cmds[pkt->handle]; ++ else ++ sp = NULL; ++ ++ if (sp) { ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[pkt->handle] = 0; ++ if (ha->actthreads) ++ ha->actthreads--; ++ sp->lun_queue->out_cnt--; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ ++ sp->flags |= SRB_ISP_COMPLETED; ++ ++ /* Bad payload or header */ ++ if (pkt->entry_status & ++ (RF_INV_E_ORDER | RF_INV_E_COUNT | ++ RF_INV_E_PARAM | RF_INV_E_TYPE)) { ++ CMD_RESULT(sp->cmd) = DID_ERROR << 16; ++ } else if (pkt->entry_status & RF_BUSY) { ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ } else { ++ CMD_RESULT(sp->cmd) = DID_ERROR << 16; ++ } ++ /* Place command on done queue. */ ++ add_to_done_queue(ha, sp); ++ ++ } else if (pkt->entry_type == COMMAND_A64_TYPE || ++ pkt->entry_type == COMMAND_TYPE) { ++ DEBUG2(printk("scsi(%ld): Error entry - invalid handle\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Error entry - invalid handle\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_ms_entry() - Process a Management Server entry. ++ * @ha: SCSI driver HA context ++ * @index: Response queue out pointer ++ */ ++static void ++qla2x00_ms_entry(scsi_qla_host_t *ha, ms_iocb_entry_t *pkt) ++{ ++ srb_t *sp; ++ ++ ENTER(__func__); ++ ++ DEBUG3(printk("%s(%ld): pkt=%p pkthandle=%d.\n", ++ __func__, ha->host_no, pkt, pkt->handle1)); ++ ++ /* Validate handle. */ ++ if (pkt->handle1 < MAX_OUTSTANDING_COMMANDS) ++ sp = ha->outstanding_cmds[pkt->handle1]; ++ else ++ sp = NULL; ++ ++ if (sp == NULL) { ++ DEBUG2(printk("scsi(%ld): MS entry - invalid handle\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): MS entry - invalid handle\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ CMD_COMPL_STATUS(sp->cmd) = le16_to_cpu(pkt->status); ++ CMD_ENTRY_STATUS(sp->cmd) = pkt->entry_status; ++ ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[pkt->handle1] = 0; ++ sp->flags |= SRB_ISP_COMPLETED; ++ ++ add_to_done_queue(ha, sp); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_check_sense() - Perform any sense data interrogation. ++ * @cp: SCSI Command ++ * @lq: Lun queue ++ * ++ * Returns QL_STATUS_SUCCESS if the lun queue is suspended, else ++ * QL_STATUS_ERROR (lun queue not suspended). ++ */ ++static int ++qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *lq) ++{ ++ scsi_qla_host_t *ha; ++ srb_t *sp; ++ fc_port_t *fcport; ++ ++ ha = (scsi_qla_host_t *) cp->device->host->hostdata; ++ if (((cp->sense_buffer[0] & 0x70) >> 4) != 7) { ++ return (QL_STATUS_ERROR); ++ } ++ ++ sp = (srb_t * )CMD_SP(cp); ++ sp->flags |= SRB_GOT_SENSE; ++ ++ switch (cp->sense_buffer[2] & 0xf) { ++ case RECOVERED_ERROR: ++ CMD_RESULT(cp) = DID_OK << 16; ++ cp->sense_buffer[0] = 0; ++ break; ++ ++ case NOT_READY: ++ fcport = lq->fclun->fcport; ++ ++ /* ++ * Suspend the lun only for hard disk device type. ++ */ ++ if (!(fcport->flags & FC_TAPE_DEVICE) && ++ lq->q_state != LUN_STATE_TIMEOUT) { ++ /* ++ * If target is in process of being ready then suspend ++ * lun for 6 secs and retry all the commands. ++ */ ++ if (cp->sense_buffer[12] == 0x4 && ++ cp->sense_buffer[13] == 0x1) { ++ ++ /* Suspend the lun for 6 secs */ ++ qla2x00_suspend_lun(ha, ++ lq, 6, ql2xsuspendcount); ++ ++ return (QL_STATUS_SUCCESS); ++ } ++ } ++ break; ++ } ++ ++ return (QL_STATUS_ERROR); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_listops.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,397 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++/* Management functions for various lists */ ++ ++/* ++ * Found in kernel 2.4.9 and higher in include/linux/lists.h ++ * ++ * Iterate over a list safe against removal of list. ++ * ++ */ ++#if !defined(list_for_each_safe) ++#define list_for_each_safe(pos, n, head) \ ++ for( pos= (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next ) ++#endif ++ ++/* __add_to_done_queue() ++ * ++ * Place SRB command on done queue. ++ * ++ * Input: ++ * ha = host pointer ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the ha->list_lock is already taken ++ */ ++static inline void ++__add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if (sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ /* Place block on done queue */ ++ sp->cmd->host_scribble = (unsigned char *) NULL; ++ sp->state = SRB_DONE_STATE; ++ list_add_tail(&sp->list,&ha->done_queue); ++ ha->done_q_cnt++; ++ sp->ha = ha; ++} ++ ++/* __add_to_free_queue() ++ * ++ * Place SRB command on free queue. ++ * ++ * Input: ++ * ha = host pointer ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the ha->list_lock is already taken ++ */ ++static inline void ++__add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if (atomic_read(&sp->ref_count) != 0) ++ BUG(); ++ */ ++ ++ ++ /* Place block on free queue */ ++ sp->state = SRB_FREE_STATE; ++ list_add_tail(&sp->list,&ha->free_queue); ++ ha->srb_cnt++; ++} ++ ++static inline void ++__add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ /* Place block on retry queue */ ++ list_add_tail(&sp->list,&ha->retry_queue); ++ ha->retry_q_cnt++; ++ sp->flags |= SRB_WATCHDOG; ++ ha->flags.watchdog_enabled = TRUE; ++ sp->state = SRB_RETRY_STATE; ++ sp->ha = ha; ++} ++ ++static inline void ++__add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ /* Place block on retry queue */ ++ list_add_tail(&sp->list,&ha->scsi_retry_queue); ++ ha->scsi_retry_q_cnt++; ++ sp->state = SRB_SCSI_RETRY_STATE; ++ sp->ha = ha; ++} ++ ++static inline void ++add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_done_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_free_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_retry_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_scsi_retry_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++/* ++ * __del_from_retry_queue ++ * Function used to remove a command block from the ++ * watchdog timer queue. ++ * ++ * Note: Must insure that command is on watchdog ++ * list before calling del_from_retry_queue ++ * if (sp->flags & SRB_WATCHDOG) ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the list_lock is already taken ++ */ ++static inline void ++__del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ list_del_init(&sp->list); ++ ++ if (list_empty(&ha->retry_queue)) ++ ha->flags.watchdog_enabled = FALSE; ++ sp->flags &= ~(SRB_WATCHDOG | SRB_BUSY); ++ sp->state = SRB_NO_QUEUE_STATE; ++ ha->retry_q_cnt--; ++} ++ ++/* ++ * __del_from_scsi_retry_queue ++ * Function used to remove a command block from the ++ * scsi retry queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the list_lock is already taken ++ */ ++static inline void ++__del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ list_del_init(&sp->list); ++ ++ ha->scsi_retry_q_cnt--; ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++/* ++ * del_from_retry_queue ++ * Function used to remove a command block from the ++ * watchdog timer queue. ++ * ++ * Note: Must insure that command is on watchdog ++ * list before calling del_from_retry_queue ++ * if (sp->flags & SRB_WATCHDOG) ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function takes and releases the list_lock ++ */ ++static inline void ++del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ /* if (unlikely(!(sp->flags & SRB_WATCHDOG))) ++ BUG();*/ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ /* if (unlikely(list_empty(&ha->retry_queue))) ++ BUG();*/ ++ ++ __del_from_retry_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++/* ++ * del_from_scsi_retry_queue ++ * Function used to remove a command block from the ++ * scsi retry queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function takes and releases the list_lock ++ */ ++static inline void ++del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ /* if (unlikely(list_empty(&ha->scsi_retry_queue))) ++ BUG();*/ ++ ++ __del_from_scsi_retry_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++__del_from_free_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ ha->srb_cnt--; ++ list_del_init(&sp->list); ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++/* ++ * __add_to_pending_queue ++ * Add the standard SCB job to the bottom of standard SCB commands. ++ * ++ * Input: ++ * COMPLETE!!! ++ * q = SCSI LU pointer. ++ * sp = srb pointer. ++ * SCSI_LU_Q lock must be already obtained. ++ */ ++static inline void ++__add_to_pending_queue(struct scsi_qla_host *ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_FREE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ list_add_tail(&sp->list, &ha->pending_queue); ++ ha->qthreads++; ++ sp->state = SRB_PENDING_STATE; ++} ++ ++static inline void ++__add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_FREE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ list_add(&sp->list, &ha->pending_queue); ++ ha->qthreads++; ++ sp->state = SRB_PENDING_STATE; ++} ++ ++static inline void ++add_to_pending_queue(struct scsi_qla_host *ha, srb_t *sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_pending_queue(ha, sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++static inline void ++add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t *sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_pending_queue_head(ha, sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++__del_from_pending_queue(struct scsi_qla_host *ha, srb_t *sp) ++{ ++ list_del_init(&sp->list); ++ ha->qthreads--; ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++/* ++ * Failover Stuff. ++ */ ++static inline void ++__add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ list_add_tail(&sp->list,&ha->failover_queue); ++ ha->failover_cnt++; ++ sp->state = SRB_FAILOVER_STATE; ++ sp->ha = ha; ++} ++ ++static inline void add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ __add_to_failover_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++static inline void __del_from_failover_queue(struct scsi_qla_host * ha, srb_t * ++ sp) ++{ ++ ha->failover_cnt--; ++ list_del_init(&sp->list); ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++static inline void del_from_failover_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ __del_from_failover_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++del_from_pending_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ __del_from_pending_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_mbx.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,2884 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ */ ++ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++/* ++ * Local Function Prototypes. ++ */ ++static void ++qla2x00_mbx_sem_timeout(unsigned long); ++ ++static uint8_t ++qla2x00_get_mbx_access(scsi_qla_host_t *, uint32_t); ++ ++static uint8_t ++qla2x00_release_mbx_access(scsi_qla_host_t *, uint32_t); ++ ++static uint8_t ++qla2x00_mbx_q_add(scsi_qla_host_t *, mbx_cmdq_t **); ++ ++static void ++qla2x00_mbx_q_get(scsi_qla_host_t *, mbx_cmdq_t **); ++ ++static void ++qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *, mbx_cmdq_t **); ++ ++static void ++qla2x00_mbx_q_memb_free(scsi_qla_host_t *, mbx_cmdq_t *); ++ ++/***************************/ ++/* Function implementation */ ++/***************************/ ++ ++static void ++qla2x00_mbx_sem_timeout(unsigned long data) ++{ ++ struct semaphore *sem_ptr = (struct semaphore *)data; ++ ++ DEBUG11(printk("qla2x00_sem_timeout: entered.\n");) ++ ++ if (sem_ptr != NULL) { ++ up(sem_ptr); ++ } ++ ++ DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");) ++} ++ ++/* ++ * tov = timeout value in seconds ++ */ ++static uint8_t ++qla2x00_get_mbx_access(scsi_qla_host_t *ha, uint32_t tov) ++{ ++ uint8_t ret; ++ int prev_val = 1; /* assume no access yet */ ++ mbx_cmdq_t *ptmp_mbq; ++ struct timer_list tmp_cmd_timer; ++ unsigned long cpu_flags; ++ ++ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): entered.\n", ++ ha->host_no);) ++ ++ while (1) { ++ if (test_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags) == 0) { ++ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): going " ++ " to test access flags.\n", ha->host_no);) ++ ++ /* No one else is waiting. Go ahead and try to ++ * get access. ++ */ ++ if ((prev_val = test_and_set_bit(MBX_CMD_ACTIVE, ++ &ha->mbx_cmd_flags)) == 0) { ++ break; ++ } ++ } ++ ++ /* wait for previous command to finish */ ++ DEBUG(printk("qla2x00_get_mbx_access(%ld): access " ++ "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n", ++ ha->host_no, ha->mbx_cmd_flags, jiffies);) ++ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): access " ++ "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n", ++ ha->host_no, ha->mbx_cmd_flags, jiffies);) ++ ++ /* ++ * Init timer and get semaphore from mbx q. After we got valid ++ * semaphore pointer the MBX_CMD_WANT flag would also had ++ * been set. ++ */ ++ qla2x00_mbx_q_add(ha, &ptmp_mbq); ++ ++ if (ptmp_mbq == NULL) { ++ /* queue full? problem? can't proceed. */ ++ DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): ERROR " ++ "no more mbx_q allowed. exiting.\n", ha->host_no);) ++ ++ break; ++ } ++ ++ /* init timer and semaphore */ ++ init_timer(&tmp_cmd_timer); ++ tmp_cmd_timer.data = (unsigned long)&ptmp_mbq->cmd_sem; ++ tmp_cmd_timer.function = ++ (void (*)(unsigned long))qla2x00_mbx_sem_timeout; ++ tmp_cmd_timer.expires = jiffies + tov * HZ; ++ ++ DEBUG11(printk("get_mbx_access(%ld): adding timer. " ++ "curr time=0x%lx timeoutval=0x%lx.\n", ++ ha->host_no, jiffies, tmp_cmd_timer.expires);) ++ ++ /* wait. */ ++/* add_timer(&tmp_cmd_timer);*/ ++ DEBUG11(printk("get_mbx_access(%ld): going to sleep. " ++ "current time=0x%lx.\n", ha->host_no, jiffies);) ++ ++ down_interruptible(&ptmp_mbq->cmd_sem); ++ ++ DEBUG11(printk("get_mbx_access(%ld): woke up. current " ++ "time=0x%lx.\n", ++ ha->host_no, jiffies);) ++ ++/* del_timer(&tmp_cmd_timer);*/ ++ ++ /* try to get lock again. we'll test later to see ++ * if we actually got the lock. ++ */ ++ prev_val = test_and_set_bit(MBX_CMD_ACTIVE, ++ &ha->mbx_cmd_flags); ++ ++ /* ++ * After we tried to get access then we check to see ++ * if we need to clear the MBX_CMD_WANT flag. Don't clear ++ * this flag before trying to get access or else another ++ * new thread might grab it before we did. ++ */ ++ spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); ++ if (ha->mbx_q_head == NULL) { ++ /* We're the last thread in queue. */ ++ clear_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags); ++ } ++ qla2x00_mbx_q_memb_free(ha, ptmp_mbq); ++ spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); ++ ++ break; ++ } ++ ++ if (prev_val == 0) { ++ /* We got the lock */ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): success.\n", ++ ha->host_no);) ++ ++ ret = QL_STATUS_SUCCESS; ++ } else { ++ /* Timeout or resource error. */ ++ DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): timed out.\n", ++ ha->host_no);) ++ ++ ret = QL_STATUS_TIMEOUT; ++ } ++ ++ return ret; ++} ++ ++static uint8_t ++qla2x00_release_mbx_access(scsi_qla_host_t *ha, uint32_t tov) ++{ ++ mbx_cmdq_t *next_thread; ++ ++ DEBUG11(printk("qla2x00_release_mbx_access:(%ld): entered.\n", ++ ha->host_no);) ++ ++ clear_bit(MBX_CMD_ACTIVE, &ha->mbx_cmd_flags); ++ ++ /* Wake up one pending mailbox cmd thread in queue. */ ++ qla2x00_mbx_q_get(ha, &next_thread); ++ if (next_thread) { ++ DEBUG11(printk("qla2x00_release_mbx_access: found pending " ++ "mbx cmd. Waking up sem in %p.\n", &next_thread);) ++ up(&next_thread->cmd_sem); ++ } ++ ++ DEBUG11(printk("qla2x00_release_mbx_access:(%ld): exiting.\n", ++ ha->host_no);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* Allocates a mbx_cmdq_t struct and add to the mbx_q list. */ ++static uint8_t ++qla2x00_mbx_q_add(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq) ++{ ++ uint8_t ret; ++ unsigned long cpu_flags; ++ mbx_cmdq_t *ptmp = NULL; ++ ++ spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); ++ ++ DEBUG11(printk("qla2x00_mbx_q_add: got mbx_q spinlock. " ++ "Inst=%d.\n", apiHBAInstance);) ++ ++ qla2x00_mbx_q_memb_alloc(ha, &ptmp); ++ if (ptmp == NULL) { ++ /* can't add any more threads */ ++ DEBUG2_3_11(printk("qla2x00_mbx_q_add: ERROR no more " ++ "ioctl threads allowed. Inst=%d.\n", apiHBAInstance);) ++ ++ ret = QL_STATUS_RESOURCE_ERROR; ++ } else { ++ if (ha->mbx_q_tail == NULL) { ++ /* First thread to queue. */ ++ set_bit(IOCTL_WANT, &ha->mbx_cmd_flags); ++ ++ ha->mbx_q_head = ptmp; ++ } else { ++ ha->mbx_q_tail->pnext = ptmp; ++ } ++ ha->mbx_q_tail = ptmp; ++ ++ /* Now init the semaphore */ ++ init_MUTEX_LOCKED(&ptmp->cmd_sem); ++ ret = QL_STATUS_SUCCESS; ++ } ++ ++ *ret_mbq = ptmp; ++ ++ DEBUG11(printk("qla2x00_mbx_q_add: going to release spinlock. " ++ "ret_mbq=%p, ret=%d. Inst=%d.\n", *ret_mbq, ret, apiHBAInstance);) ++ ++ spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); ++ ++ return ret; ++} ++ ++/* Just remove and return first member from mbx_cmdq. Don't free anything. */ ++static void ++qla2x00_mbx_q_get(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq) ++{ ++ unsigned long cpu_flags; ++ ++ spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); ++ ++ DEBUG11(printk("qla2x00_mbx_q_get: got mbx_q spinlock. " ++ "Inst=%d.\n", apiHBAInstance);) ++ ++ /* Remove from head */ ++ *ret_mbq = ha->mbx_q_head; ++ if (ha->mbx_q_head != NULL) { ++ ha->mbx_q_head = ha->mbx_q_head->pnext; ++ if (ha->mbx_q_head == NULL) { ++ /* That's the last one in queue. */ ++ ha->mbx_q_tail = NULL; ++ } ++ (*ret_mbq)->pnext = NULL; ++ } ++ ++ DEBUG11(printk("qla2x00_mbx_q_remove: return ret_mbq=%p. Going to " ++ "release spinlock. Inst=%d.\n", *ret_mbq, apiHBAInstance);) ++ ++ spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); ++} ++ ++/* Find a free mbx_q member from the array. Must already got the ++ * mbx_q_lock spinlock. ++ */ ++static void ++qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbx_q_memb) ++{ ++ mbx_cmdq_t *ptmp = NULL; ++ ++ DEBUG11(printk("qla2x00_mbx_q_memb_alloc: entered. " ++ "Inst=%d.\n", apiHBAInstance);) ++ ++ ptmp = ha->mbx_sem_pool_head; ++ if (ptmp != NULL) { ++ ha->mbx_sem_pool_head = ptmp->pnext; ++ ptmp->pnext = NULL; ++ if (ha->mbx_sem_pool_head == NULL) { ++ ha->mbx_sem_pool_tail = NULL; ++ } ++ } else { ++ /* We ran out of pre-allocated semaphores. Try to allocate ++ * a new one. ++ */ ++ ptmp = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 40); ++ } ++ ++ *ret_mbx_q_memb = ptmp; ++ ++ DEBUG11(printk("qla2x00_mbx_q_memb_alloc: return waitq_memb=%p. " ++ "Inst=%d.\n", *ret_mbx_q_memb, apiHBAInstance);) ++} ++ ++/* Add the specified mbx_q member back to the free semaphore pool. Must ++ * already got the mbx_q_lock spinlock. ++ */ ++static void ++qla2x00_mbx_q_memb_free(scsi_qla_host_t *ha, mbx_cmdq_t *pfree_mbx_q_memb) ++{ ++ DEBUG11(printk("qla2x00_mbx_q_memb_free: entered. Inst=%d.\n", ++ apiHBAInstance);) ++ ++ if (pfree_mbx_q_memb != NULL) { ++ if (ha->mbx_sem_pool_tail != NULL) { ++ /* Add to tail */ ++ ha->mbx_sem_pool_tail->pnext = pfree_mbx_q_memb; ++ } else { ++ ha->mbx_sem_pool_head = pfree_mbx_q_memb; ++ } ++ ha->mbx_sem_pool_tail = pfree_mbx_q_memb; ++ } ++ ++ /* put it back to the free pool. */ ++ ++ DEBUG11(printk("qla2x00_mbx_q_memb_free: exiting. " ++ "Inst=%d.\n", apiHBAInstance);) ++} ++ ++/* ++ * qla2x00_mailbox_command ++ * Issue mailbox command and waits for completion. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * mcp = driver internal mbx struct pointer. ++ * ++ * Output: ++ * mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data. ++ * ++ * Returns: ++ * 0 : QL_STATUS_SUCCESS = cmd performed success ++ * 1 : QL_STATUS_ERROR (error encountered) ++ * 6 : QL_STATUS_TIMEOUT (timeout condition encountered) ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint8_t ++qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg = ha->iobase; ++ struct timer_list tmp_intr_timer; ++ uint8_t abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ uint8_t io_lock_on = ha->init_done; ++ uint8_t mbx_count; ++ uint8_t status = 0; ++ uint8_t tmp_stat = 0; ++ uint16_t command; ++ uint16_t *iptr, *optr; ++ uint32_t cnt; ++ uint32_t mboxes; ++ unsigned long mbx_flags = 0; ++ unsigned long wait_time; ++ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): entered.\n", ++ ha->host_no);) ++ /* ++ * Wait for active mailbox commands to finish by waiting at most ++ * tov seconds. This is to serialize actual issuing of mailbox cmds ++ * during non ISP abort time. ++ */ ++ if (!abort_active) { ++ tmp_stat = qla2x00_get_mbx_access(ha, mcp->tov); ++ if (tmp_stat != QL_STATUS_SUCCESS) { ++ /* Timeout occurred. Return error. */ ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): cmd " ++ "access timeout. Exiting.\n", ha->host_no);) ++ return QL_STATUS_TIMEOUT; ++ } ++ } ++ ++ ha->flags.mbox_busy = TRUE; ++ /* Save mailbox command for debug */ ++ ha->mcp = mcp; ++ ++ /* Try to get mailbox register access */ ++ if (!abort_active) ++ QLA_MBX_REG_LOCK(ha); ++ ++ DEBUG11(printk("scsi%d: prepare to issue mbox cmd=0x%x.\n", ++ (int)ha->host_no, mcp->mb[0]);) ++ ++ ha->mbox_trace = 0; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Load mailbox registers. */ ++ optr = (uint16_t *)®->mailbox0; ++ mbx_count = MAILBOX_REGISTER_COUNT; ++ ++ iptr = mcp->mb; ++ command = mcp->mb[0]; ++ mboxes = mcp->out_mb; ++ ++ for (cnt = 0; cnt < mbx_count; cnt++) { ++#if defined(ISP2200) ++ if (cnt == 8) { ++ optr = (uint16_t *)®->mailbox8; ++ } ++#endif ++ if (mboxes & BIT_0) { ++ WRT_REG_WORD(optr, *iptr); ++ } ++ ++ mboxes >>= 1; ++ optr++; ++ iptr++; ++ } ++ ++#if defined(QL_DEBUG_LEVEL_1) ++ printk("qla2x00_mailbox_command: Loaded MBX registers " ++ "(displayed in bytes) = \n"); ++ qla2x00_dump_buffer((uint8_t *)mcp->mb, 16); ++ printk("\n"); ++ qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16); ++ printk("\n"); ++ qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8); ++ printk("\n"); ++ printk("qla2x00_mailbox_command: I/O address = %lx.\n", ++ (u_long)optr); ++ qla2x00_dump_regs(ha->host); ++#endif ++ ++ /* Issue set host interrupt command to send cmd out. */ ++ ha->flags.mbox_int = FALSE; ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ /* Unlock mbx registers and wait for interrupt */ ++ ++ DEBUG11(printk("qla2x00_mailbox_command: going to unlock irq & " ++ "waiting for interrupt. jiffies=%lx.\n", jiffies);) ++ ++ /* Wait for mbx cmd completion until timeout */ ++ ++ if (!abort_active && io_lock_on) { ++ /* sleep on completion semaphore */ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): " ++ "INTERRUPT MODE. Initializing timer.\n", ++ ha->host_no);) ++ ++ init_timer(&tmp_intr_timer); ++ tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem; ++ tmp_intr_timer.expires = jiffies + mcp->tov * HZ; ++ tmp_intr_timer.function = ++ (void (*)(unsigned long))qla2x00_mbx_sem_timeout; ++ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): " ++ "Adding timer.\n", ha->host_no);) ++ add_timer(&tmp_intr_timer); ++ ++ DEBUG11(printk("qla2x00_mailbox_command: going to " ++ "unlock & sleep. time=0x%lx.\n", jiffies);) ++ ++ MBOX_TRACE(ha,BIT_0); ++ set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); ++ ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ if (!abort_active) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ MBOX_TRACE(ha,BIT_1); ++ ++ /* Wait for either the timer to expire ++ * or the mbox completion interrupt ++ */ ++ down_interruptible(&ha->mbx_intr_sem); ++ ++ DEBUG11(printk("qla2x00_mailbox_command:" ++ "waking up." ++ "time=0x%lx\n", jiffies);) ++ clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); ++ ++ /* delete the timer */ ++ del_timer(&tmp_intr_timer); ++#if QLA2100_LIPTEST ++ if (mbxtimeout) { ++ DEBUG(printk("qla2x00_mailbox_command(%ld): " ++ "INTERRUPT MODE - testing timeout handling.\n", ++ ha->host_no);) ++ ha->flags.mbox_int= FALSE; ++ } ++ mbxtimeout= 0; ++#endif ++ ++ } else { ++ ++ DEBUG3_11(printk("qla2x00_mailbox_command(%ld): cmd=%x " ++ "POLLING MODE.\n", ha->host_no, command);) ++ ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ if (!abort_active) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ ++ wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */ ++ while (!ha->flags.mbox_int) { ++ if (time_after(jiffies, wait_time)) ++ break; ++ ++ /* Check for pending interrupts. */ ++ qla2x00_poll(ha); ++ ++ udelay(10); /* v4.27 */ ++ } /* while */ ++ } ++ ++ if (!abort_active) ++ QLA_MBX_REG_LOCK(ha); ++ ++ /* Check whether we timed out */ ++ if (ha->flags.mbox_int) { ++ ++ DEBUG3_11(printk("qla2x00_mailbox_cmd: cmd %x completed.\n", ++ command);) ++ ++ /* Got interrupt. Clear the flag. */ ++ ha->flags.mbox_int = FALSE; ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ if( ha->mailbox_out[0] != MBS_CMD_CMP ) { ++ qla2x00_stats.mboxerr++; ++ status = QL_STATUS_ERROR; ++ } ++ ++ /* Load return mailbox registers. */ ++ optr = mcp->mb; ++ iptr = (uint16_t *)&ha->mailbox_out[0]; ++ mboxes = mcp->in_mb; ++ for (cnt = 0; cnt < mbx_count; cnt++) { ++ ++ if (mboxes & BIT_0) ++ *optr = *iptr; ++ ++ mboxes >>= 1; ++ optr++; ++ iptr++; ++ } ++ } else { ++ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \ ++ defined(QL_DEBUG_LEVEL_11) ++ printk("qla2x00_mailbox_command(%ld): **** MB Command Timeout " ++ "for cmd %x ****\n", ha->host_no, command); ++ printk("qla2x00_mailbox_command: icontrol=%x jiffies=%lx\n", ++ RD_REG_WORD(®->ictrl), jiffies); ++ printk("qla2x00_mailbox_command: *** mailbox[0] = 0x%x ***\n", ++ RD_REG_WORD(optr)); ++ qla2x00_dump_regs(ha->host); ++#endif ++ ++ qla2x00_stats.mboxtout++; ++ status = QL_STATUS_TIMEOUT; ++ } ++ ++ if (!abort_active) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ ha->flags.mbox_busy = FALSE; ++ ++ /* Clean up */ ++ ha->mcp = NULL; ++ ++ if (!abort_active) { ++ DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional " ++ "resp interrupt.\n");) ++ ++ /* polling mode for non isp_abort commands. */ ++ qla2x00_poll(ha); ++ } ++ ++ if (status == QL_STATUS_TIMEOUT ) { ++ if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { ++ /* not in dpc. schedule it for dpc to take over. */ ++ DEBUG(printk("qla2x00_mailbox_command(%ld): timeout " ++ "schedule isp_abort_needed.\n", ++ ha->host_no);) ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): " ++ "timeout schedule isp_abort_needed.\n", ++ ha->host_no);) ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ ++ } else if (!abort_active) { ++ ++ /* call abort directly since we are in the DPC thread */ ++ DEBUG(printk("qla2x00_mailbox_command(%ld): timeout " ++ "calling abort_isp\n", ha->host_no);) ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): " ++ "timeout calling abort_isp\n", ha->host_no);) ++ ++ set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (qla2x00_abort_isp(ha, 0)) { ++ /* failed. retry later. */ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ ++ DEBUG(printk("qla2x00_mailbox_command: finished " ++ "abort_isp\n");) ++ DEBUG2_3_11(printk("qla2x00_mailbox_command: finished " ++ "abort_isp\n");) ++ } ++ } ++ ++ /* Allow next mbx cmd to come in. */ ++ if (!abort_active) { ++ tmp_stat = qla2x00_release_mbx_access(ha, mcp->tov); ++ ++ if (status == 0) ++ status = tmp_stat; ++ } ++ ++ if (status) { ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. " ++ "mbx0=%x, mbx1=%x, mbx2=%x, cmd=%x ****\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1], mcp->mb[2], command);) ++ } else { ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): exiting.\n", ++ ha->host_no);) ++ ++ return status; ++} ++ ++/* ++ * qla2x00_load_ram ++ * Load adapter RAM using DMA. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, ++ uint16_t risc_addr, uint16_t risc_code_size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ uint32_t req_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ ++ DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n", ++ ha->host_no);) ++ ++ req_len = risc_code_size; ++ nml_dma = 0; ++ nml_len = 0; ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &req_dma, &req_len, ++ &nml_dma, &nml_len); ++ ++ /* Load first segment */ ++ mcp->mb[0] = MBC_LOAD_RAM_A64; ++ mcp->mb[1] = risc_addr; ++ mcp->mb[2] = MSW(req_dma); ++ mcp->mb[3] = LSW(req_dma); ++ mcp->mb[4] = (uint16_t)req_len; ++ mcp->mb[6] = MSW(MSD(req_dma)); ++ mcp->mb[7] = LSW(MSD(req_dma)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Load second segment - if necessary */ ++ if (normalized && (rval == QL_STATUS_SUCCESS)) { ++ mcp->mb[0] = MBC_LOAD_RAM_A64; ++ mcp->mb[1] = risc_addr + (uint16_t)req_len; ++ mcp->mb[2] = MSW(nml_dma); ++ mcp->mb[3] = LSW(nml_dma); ++ mcp->mb[4] = (uint16_t)nml_len; ++ mcp->mb[6] = MSW(MSD(nml_dma)); ++ mcp->mb[7] = LSW(MSD(nml_dma)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ } ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ /* Empty */ ++ DEBUG11(printk("qla2x00_load_ram(%ld): done.\n", ++ ha->host_no);) ++ } else { ++ /* Empty */ ++ DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x " ++ "mb[0]=%x.\n", ++ ha->host_no, rval, mcp->mb[0]);) ++ } ++ return rval; ++} ++ ++/* ++ * qla2x00_load_ram_ext ++ * Load adapter extended RAM using DMA. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_load_ram_ext(scsi_qla_host_t *ha, ++ dma_addr_t req_dma, uint32_t risc_addr, uint16_t risc_code_size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ uint32_t req_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ req_len = risc_code_size; ++ nml_dma = 0; ++ nml_len = 0; ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &req_dma, &req_len, ++ &nml_dma, &nml_len); ++ ++ /* Load first segment */ ++ mcp->mb[0] = MBC_LOAD_RAM_EXTENDED; ++ mcp->mb[1] = LSW(risc_addr); ++ mcp->mb[2] = MSW(req_dma); ++ mcp->mb[3] = LSW(req_dma); ++ mcp->mb[4] = (uint16_t)req_len; ++ mcp->mb[6] = MSW(MSD(req_dma)); ++ mcp->mb[7] = LSW(MSD(req_dma)); ++ mcp->mb[8] = MSW(risc_addr); ++ ++ mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Load second segment - if necessary */ ++ if (normalized && (rval == QL_STATUS_SUCCESS)) { ++ risc_addr += req_len; ++ mcp->mb[0] = MBC_LOAD_RAM_EXTENDED; ++ mcp->mb[1] = LSW(risc_addr); ++ mcp->mb[2] = MSW(nml_dma); ++ mcp->mb[3] = LSW(nml_dma); ++ mcp->mb[4] = (uint16_t)nml_len; ++ mcp->mb[6] = MSW(MSD(nml_dma)); ++ mcp->mb[7] = LSW(MSD(nml_dma)); ++ mcp->mb[8] = MSW(risc_addr); ++ ++ mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", ++ __func__, ha->host_no, rval, mcp->mb[0])); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_execute_fw ++ * Start adapter firmware. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_execute_fw(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_EXECUTE_FIRMWARE; ++ mcp->mb[1] = *ha->brd_info->fwinfo[0].fwstart; ++ mcp->out_mb = MBX_1|MBX_0; ++ if (ha->pdev->device == QLA2322_DEVICE_ID) { ++ mcp->mb[2] = 0; ++ mcp->out_mb |= MBX_2; ++ } ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n", ++ ha->host_no);) ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_fw_version ++ * Get firmware version. ++ * ++ * Input: ++ * ha: adapter state pointer. ++ * major: pointer for major number. ++ * minor: pointer for minor number. ++ * subminor: pointer for subminor number. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, ++ uint16_t *minor, uint16_t *subminor, uint16_t *attributes) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_ABOUT_FIRMWARE; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->flags = 0; ++ mcp->tov = 30; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return mailbox data. */ ++ *major = mcp->mb[1]; ++ *minor = mcp->mb[2]; ++ *subminor = mcp->mb[3]; ++ *attributes = mcp->mb[6]; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++} ++ ++/* ++ * qla2x00_get_fw_options ++ * Set firmware options. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fwopt = pointer for firmware options. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_fw_options(scsi_qla_host_t *ha, ++ uint16_t *fwopts1, uint16_t *fwopts2, uint16_t *fwopts3) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_GET_FIRMWARE_OPTIONS; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ *fwopts1 = mcp->mb[1]; ++ *fwopts2 = mcp->mb[2]; ++ *fwopts3 = mcp->mb[3]; ++ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2x00_set_fw_options ++ * Set firmware options. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fwopt = pointer for firmware options. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_set_fw_options(scsi_qla_host_t *ha, ++ uint16_t fwopts1, uint16_t fwopts2, uint16_t fwopts3, ++ uint16_t fwopts10, uint16_t fwopts11) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_SET_FIRMWARE_OPTIONS; ++ mcp->mb[1] = fwopts1; ++ mcp->mb[2] = fwopts2; ++ mcp->mb[3] = fwopts3; ++ mcp->mb[10] = fwopts10; ++ mcp->mb[11] = fwopts11; ++ mcp->mb[12] = 0; /* Undocumented, but used */ ++ mcp->out_mb = MBX_12|MBX_11|MBX_10|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_read_ram_word ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_read_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t *data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_read_ram_word(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_READ_RAM_WORD; ++ mcp->mb[1] = addr; ++ ++ mcp->out_mb = MBX_1|MBX_0; ++ mcp->in_mb = MBX_0|MBX_2; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_read_ram_word(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ *data = mcp->mb[2]; ++ DEBUG11(printk("qla2x00_read_ram_word(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_write_ram_word ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_write_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_write_ram_word(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_WRITE_RAM_WORD; ++ mcp->mb[1] = addr; ++ mcp->mb[2] = data; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_write_ram_word(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_write_ram_word(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_write_ram_word_ext ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_write_ram_word_ext(scsi_qla_host_t *ha, uint32_t addr, uint16_t data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED; ++ mcp->mb[1] = LSW(addr); ++ mcp->mb[2] = data; ++ mcp->mb[8] = MSW(addr); ++ mcp->out_mb = MBX_8|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_mbx_reg_test ++ * Mailbox register wrap test. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_mbx_reg_test(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST; ++ mcp->mb[1] = 0xAAAA; ++ mcp->mb[2] = 0x5555; ++ mcp->mb[3] = 0xAA55; ++ mcp->mb[4] = 0x55AA; ++ mcp->mb[5] = 0xA5A5; ++ mcp->mb[6] = 0x5A5A; ++ mcp->mb[7] = 0x2525; ++ mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 || ++ mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA) ++ rval = QL_STATUS_ERROR; ++ if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || ++ mcp->mb[7] != 0x2525) ++ rval = QL_STATUS_ERROR; ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_verify_checksum ++ * Verify firmware checksum. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_verify_checksum(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_verify_checksum(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_VERIFY_CHECKSUM; ++ mcp->mb[1] = *ha->brd_info->fwinfo[0].fwstart; ++ mcp->out_mb = MBX_1|MBX_0; ++ mcp->in_mb = MBX_2|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_verify_checksum(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_verify_checksum(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_issue_iocb ++ * Issue IOCB using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * buffer = buffer pointer. ++ * phys_addr = physical address of buffer. ++ * size = size of buffer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_issue_iocb(scsi_qla_host_t *ha, void* buffer, dma_addr_t phys_addr, ++ size_t size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ ENTER("qla2x00_issue_iocb: started"); ++ ++ mcp->mb[0] = MBC_IOCB_EXECUTE_A64; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = MSW(phys_addr); ++ mcp->mb[3] = LSW(phys_addr); ++ mcp->mb[6] = MSW(MSD(phys_addr)); ++ mcp->mb[7] = LSW(MSD(phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_2|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x", ++ ha->host_no,rval);) ++ DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x", ++ ha->host_no,rval);) ++ } else { ++ /*EMPTY*/ ++ LEAVE("qla2x00_issue_iocb: exiting normally"); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_abort_command ++ * Abort command aborts a specified IOCB. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = SB structure pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ unsigned long flags = 0; ++ scsi_qla_host_t *curr_ha; ++ fc_port_t *fcport; ++ int rval; ++ uint32_t handle; ++ uint16_t t; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ os_lun_t *lq = sp->lun_queue; ++ ++ DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ++ ha->host_no);) ++ ++ curr_ha = lq->fclun->fcport->ha; ++ t = SCSI_TCN_32(sp->cmd); ++ fcport = lq->fclun->fcport; ++ if (curr_ha->loop_state == LOOP_DOWN || ++ atomic_read(&fcport->state) == FC_DEVICE_LOST) { ++ /* v2.19.8 Ignore abort request if port is down */ ++ return 1; ++ } ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { ++ if( ha->outstanding_cmds[handle] == sp ) ++ break; ++ } ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ if (handle == MAX_OUTSTANDING_COMMANDS) { ++ /* command not found */ ++ return QL_STATUS_ERROR; ++ } ++ ++ mcp->mb[0] = MBC_ABORT_COMMAND; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = fcport->loop_id & 0xFF; ++#else ++ mcp->mb[1] = fcport->loop_id << 8; ++#endif ++ mcp->mb[2] = (uint16_t)handle; ++ mcp->mb[3] = (uint16_t)(handle >> 16); ++ mcp->mb[6] = (uint16_t)lq->fclun->lun; ++ mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ sp->flags |= SRB_ABORT_PENDING; ++ DEBUG11(printk("qla2x00_abort_command(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_abort_device ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = FC loop ID ++ * lun = SCSI LUN. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_abort_device(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_abort_device(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_ABORT_DEVICE; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = lun; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Issue marker command. */ ++ qla2x00_marker(ha, loop_id, lun, MK_SYNC_ID_LUN); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ DEBUG2_3_11(printk("qla2x00_abort_device(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_abort_device(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++#if USE_ABORT_TGT ++/* ++ * qla2x00_abort_target ++ * Issue abort target mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * b = Always 0. ++ * t = SCSI ID. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_abort_target(fc_port_t *fcport) ++{ ++ int rval; ++ uint16_t loop_id; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_abort_target(%ld): entered.\n", ++ fcport->ha->host_no);) ++ ++ if (fcport == NULL) { ++ /* no target to abort */ ++ return 0; ++ } ++ ++ loop_id = fcport->loop_id; ++ ++ mcp->mb[0] = MBC_ABORT_TARGET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = fcport->ha->loop_reset_delay; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(fcport->ha, mcp); ++ ++ /* Issue marker command. */ ++/* qla2x00_marker(fcport->ha, loop_id, 0, MK_SYNC_ID);*/ ++ fcport->ha->marker_needed = 1; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++/* set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); */ ++ DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n", ++ fcport->ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_abort_target(%ld): done.\n", ++ fcport->ha->host_no);) ++ } ++ ++ return rval; ++} ++#endif ++ ++/* ++ * qla2x00_target_reset ++ * Issue target reset mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_target_reset(scsi_qla_host_t *ha, uint16_t b, uint16_t t) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ os_tgt_t *tgt; ++ ++ DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha->host_no);) ++ ++ tgt = TGT_Q(ha, t); ++ if (tgt->vis_port == NULL) { ++ /* no target to abort */ ++ return 0; ++ } ++ if (atomic_read(&tgt->vis_port->state) != FC_ONLINE) { ++ /* target not online */ ++ return 0; ++ } ++ ++ mcp->mb[0] = MBC_TARGET_RESET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = tgt->vis_port->loop_id & 0xFF; ++#else ++ mcp->mb[1] = tgt->vis_port->loop_id << 8; ++#endif ++ mcp->mb[2] = ha->loop_reset_delay; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_target_reset(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_target_reset(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_adapter_id ++ * Get adapter ID and topology. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * id = pointer for loop ID. ++ * al_pa = pointer for AL_PA. ++ * area = pointer for area. ++ * domain = pointer for domain. ++ * top = pointer for topology. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa, ++ uint8_t *area, uint8_t *domain, uint16_t *top) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return data. */ ++ *id = mcp->mb[1]; ++ *al_pa = LSB(mcp->mb[2]); ++ *area = MSB(mcp->mb[2]); ++ *domain = LSB(mcp->mb[3]); ++ *top = mcp->mb[6]; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_retry_cnt ++ * Get current firmware login retry count and delay. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * retry_cnt = pointer to login retry count. ++ * tov = pointer to login timeout value. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov) ++{ ++ int rval; ++ uint16_t ratov; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_RETRY_COUNT; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n", ++ ha->host_no, mcp->mb[0]);) ++ } else { ++ /* Convert returned data and check our values. */ ++ ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */ ++ if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) { ++ /* Update to the larger values */ ++ *retry_cnt = (uint8_t)mcp->mb[1]; ++ *tov = ratov; ++ } ++ ++ DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d " ++ "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_loopback_test ++ * Send out a LOOPBACK mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * retry_cnt = pointer to login retry count. ++ * tov = pointer to login timeout value. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req, ++ uint16_t *ret_mb) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ memset(mcp->mb, 0 , sizeof(mcp->mb)); ++ ++ mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK; ++ mcp->mb[1] = req->Options; ++ mcp->mb[10] = LSW(req->TransferCount); ++ mcp->mb[11] = MSW(req->TransferCount); ++ ++ mcp->mb[14] = LSW(ha->ioctl_mem_phys); /* send data address */ ++ mcp->mb[15] = MSW(ha->ioctl_mem_phys); ++ mcp->mb[20] = LSW(MSD(ha->ioctl_mem_phys)); ++ mcp->mb[21] = MSW(MSD(ha->ioctl_mem_phys)); ++ ++ mcp->mb[16] = LSW(ha->ioctl_mem_phys); /* rcv data address */ ++ mcp->mb[17] = MSW(ha->ioctl_mem_phys); ++ mcp->mb[6] = LSW(MSD(ha->ioctl_mem_phys)); ++ mcp->mb[7] = MSW(MSD(ha->ioctl_mem_phys)); ++ ++ mcp->mb[18] = LSW(req->IterationCount); /* iteration count lsb */ ++ mcp->mb[19] = MSW(req->IterationCount); /* iteration count msb */ ++ ++ mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15| ++ MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; ++ mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->buf_size = req->TransferCount; ++ mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD; ++ mcp->tov = 30; ++ ++ DEBUG11(printk("qla2x00_send_loopback: req.Options=%x iterations=%x " ++ "MAILBOX_CNT=%d.\n", req->Options, req->IterationCount, ++ MAILBOX_REGISTER_COUNT);) ++ ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ /* Always copy back return mailbox values. */ ++ memcpy((void *)ret_mb, (void *)mcp->mb, sizeof(mcp->mb)); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /* Empty. */ ++ DEBUG2_3_11(printk( ++ "qla2x00_loopback_test(%ld): mailbox command FAILED=%x.\n", ++ ha->host_no, mcp->mb[0]);) ++ } else { ++ /* Empty. */ ++ DEBUG11(printk( ++ "qla2x00_loopback_test(%ld): done.\n", ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_init_firmware ++ * Initialize adapter firmware. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * dptr = Initialization control block pointer. ++ * size = size of initialization control block. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_INITIALIZE_FIRMWARE; ++ mcp->mb[2] = MSW(ha->init_cb_dma); ++ mcp->mb[3] = LSW(ha->init_cb_dma); ++ mcp->mb[4] = 0; ++ mcp->mb[5] = 0; ++ mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); ++ mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; ++ mcp->in_mb = MBX_5|MBX_4|MBX_0; ++ mcp->buf_size = size; ++ mcp->flags = MBX_DMA_OUT; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x " ++ "mb0=%x.\n", ++ ha->host_no, rval, mcp->mb[0]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_port_database ++ * Issue normal/enhanced get port database mailbox command ++ * and copy device name as necessary. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * dev = structure pointer. ++ * opt = enhanced cmd option byte. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_port_database(scsi_qla_host_t *ha, fcdev_t *dev, uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ port_database_t *pd; ++ dma_addr_t phys_address = 0; ++ ++ DEBUG11(printk("qla2x00_get_port_database(%ld): entered.\n", ++ ha->host_no);) ++ ++ pd = pci_alloc_consistent(ha->pdev, PORT_DATABASE_SIZE, &phys_address); ++ if (pd == NULL) { ++ DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): **** " ++ "Mem Alloc Failed ****", ++ ha->host_no);) ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ memset(pd, 0, PORT_DATABASE_SIZE); ++ ++ if (opt != 0) ++ mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE; ++ else ++ mcp->mb[0] = MBC_GET_PORT_DATABASE; ++ ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = dev->loop_id & 0xFF; ++#else ++ mcp->mb[1] = dev->loop_id << 8 | opt; ++#endif ++ mcp->mb[2] = MSW(phys_address); ++ mcp->mb[3] = LSW(phys_address); ++ mcp->mb[6] = MSW(MSD(phys_address)); ++ mcp->mb[7] = LSW(MSD(phys_address)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = opt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->buf_size = PORT_DATABASE_SIZE; ++ mcp->flags = MBX_DMA_IN; ++ /*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/ ++ mcp->tov = ha->login_timeout * 2; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ /* Save some data */ ++ /* Names are big endian. */ ++ memcpy((void *)&dev->name[0],(void *)&pd->node_name[0], 8); ++ memcpy((void *)&dev->wwn[0], (void *)&pd->port_name[0], 8); ++ ++ /* Get port_id of device. */ ++ dev->d_id.b.al_pa = pd->port_id[2]; ++ dev->d_id.b.area = pd->port_id[3]; ++ dev->d_id.b.domain = pd->port_id[0]; ++ dev->d_id.b.rsvd_1 = 0; ++ ++ /* Get initiator status of device. */ ++ pd->prli_svc_param_word_3[0] & BIT_5 ? ++ (dev->flag = dev->flag | DEV_INITIATOR) : ++ (dev->flag = dev->flag & ~DEV_INITIATOR); ++ ++ /* Check for logged in and whether target device. */ ++ if (pd->master_state != PD_STATE_PORT_LOGGED_IN && ++ pd->slave_state != PD_STATE_PORT_LOGGED_IN) { ++ rval = QL_STATUS_ERROR; ++ } else if (pd->master_state == PD_STATE_PORT_UNAVAILABLE) { ++ rval = QL_STATUS_ERROR; ++ } ++ } ++ ++ pci_free_consistent(ha->pdev, PORT_DATABASE_SIZE, pd, phys_address); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): " ++ "failed=%x.\n", ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_port_database(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_firmware_state ++ * Get adapter firmware state. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * dptr = pointer for firmware state. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_FIRMWARE_STATE; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return firmware state. */ ++ *dptr = mcp->mb[1]; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): " ++ "failed=%x.\n", ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_port_name ++ * Issue get port name mailbox command. ++ * Returned name is in big endian format. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = loop ID of device. ++ * name = pointer for name. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name, ++ uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_PORT_NAME; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8 | opt; ++#endif ++ mcp->out_mb = MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = opt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ if (name != NULL) { ++ /* This function returns name in big endian. */ ++ name[0] = LSB(mcp->mb[2]); ++ name[1] = MSB(mcp->mb[2]); ++ name[2] = LSB(mcp->mb[3]); ++ name[3] = MSB(mcp->mb[3]); ++ name[4] = LSB(mcp->mb[6]); ++ name[5] = MSB(mcp->mb[6]); ++ name[6] = LSB(mcp->mb[7]); ++ name[7] = MSB(mcp->mb[7]); ++ } ++ ++ DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_link_status ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * ret_buf = pointer to link status return buffer. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = mem alloc error. ++ * BIT_1 = mailbox error. ++ */ ++uint8_t ++qla2x00_get_link_status(scsi_qla_host_t *ha, uint8_t loop_id, void *ret_buf, ++ uint16_t *status) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ link_stat_t *stat_buf; ++ dma_addr_t phys_address = 0; ++ ++ ++ DEBUG11(printk("qla2x00_get_link_status(%ld): entered.\n", ++ ha->host_no);) ++ ++ stat_buf = pci_alloc_consistent(ha->pdev, sizeof(link_stat_t), ++ &phys_address); ++ if (stat_buf == NULL) { ++ DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): Failed to " ++ "allocate memory.\n", ha->host_no)); ++ return BIT_0; ++ } ++ ++ memset(stat_buf, 0, sizeof(link_stat_t)); ++ ++ mcp->mb[0] = MBC_GET_LINK_STATUS; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = MSW(phys_address); ++ mcp->mb[3] = LSW(phys_address); ++ mcp->mb[6] = MSW(MSD(phys_address)); ++ mcp->mb[7] = LSW(MSD(phys_address)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = IOCTL_CMD; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ ++ if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { ++ DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): cmd " ++ "failed. mbx0=%x.\n", ha->host_no, mcp->mb[0]);) ++ status[0] = mcp->mb[0]; ++ rval = BIT_1; ++ } else { ++ /* copy over data */ ++ memcpy(ret_buf, stat_buf,sizeof(link_stat_t)); ++ DEBUG(printk("qla2x00_get_link_status(%ld): stat dump: " ++ "fail_cnt=%d loss_sync=%d loss_sig=%d seq_err=%d " ++ "inval_xmt_word=%d inval_crc=%d.\n", ++ ha->host_no, ++ stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt, ++ stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt, ++ stat_buf->inval_xmit_word_cnt, ++ stat_buf->inval_crc_cnt);) ++ DEBUG11(printk("qla2x00_get_link_status(%ld): stat " ++ "dump: fail_cnt=%d loss_sync=%d loss_sig=%d " ++ "seq_err=%d inval_xmt_word=%d inval_crc=%d.\n", ++ ha->host_no, ++ stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt, ++ stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt, ++ stat_buf->inval_xmit_word_cnt, ++ stat_buf->inval_crc_cnt);) ++ } ++ } else { ++ /* Failed. */ ++ DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ rval = BIT_1; ++ } ++ ++ pci_free_consistent(ha->pdev, sizeof(link_stat_t), ++ stat_buf, phys_address); ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_lip_reset ++ * Issue LIP reset mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_lip_reset(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_lip_reset(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LIP_RESET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = 0x00ff; ++#else ++ mcp->mb[1] = 0xff00; ++#endif ++ mcp->mb[2] = ha->loop_reset_delay; ++ mcp->mb[3] = 0; ++ mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_lip_reset(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_lip_reset(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_send_sns ++ * Send SNS command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sns = pointer for command. ++ * cmd_size = command size. ++ * buf_size = response/command size. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address, ++ uint16_t cmd_size, size_t buf_size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_SEND_SNS_COMMAND; ++ mcp->mb[1] = cmd_size; ++ mcp->mb[2] = MSW(sns_phys_address); ++ mcp->mb[3] = LSW(sns_phys_address); ++ mcp->mb[6] = MSW(MSD(sns_phys_address)); ++ mcp->mb[7] = LSW(MSD(sns_phys_address)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0|MBX_1; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_OUT|MBX_DMA_IN; ++ /*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/ ++ mcp->tov = ha->login_timeout * 2; ++ ++ DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total " ++ "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);) ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " ++ "mb[1]=%x.\n", ++ ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) ++ DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " ++ "mb[1]=%x.\n", ++ ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_login_fabric ++ * Issue login fabric port mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * domain = device domain. ++ * area = device area. ++ * al_pa = device AL_PA. ++ * status = pointer for return status. ++ * opt = command options. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, ++ uint8_t area, uint8_t al_pa, uint16_t *status, uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LOGIN_FABRIC_PORT; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = (loop_id << 8) | opt; ++#endif ++ mcp->mb[2] = domain; ++ mcp->mb[3] = area << 8 | al_pa; ++ mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = opt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_2|MBX_1|MBX_0; ++ /*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/ ++ mcp->tov = ha->login_timeout * 2; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return mailbox statuses. */ ++ if (status != NULL) { ++ *status++ = mcp->mb[0]; ++ *status++ = mcp->mb[1]; ++ *status = mcp->mb[2]; ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /* RLU tmp code: need to change main mailbox_command function to ++ * return ok even when the mailbox completion value is not ++ * SUCCESS. The caller needs to be responsible to interpret ++ * the return values of this mailbox command if we're not ++ * to change too much of the existing code. ++ */ ++ if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 || ++ mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 || ++ mcp->mb[0] == 0x4006) ++ rval = QL_STATUS_SUCCESS; ++ ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x " ++ "mb[1]=%x mb[2]=%x.\n", ++ ha->host_no, rval, mcp->mb[1], mcp->mb[2]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_login_local_device ++ * Issue login loop port mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * opt = command options. ++ * ++ * Returns: ++ * Return status code. ++ * ++ * Context: ++ * Kernel context. ++ * ++ */ ++int ++qla2x00_login_local_device(scsi_qla_host_t *ha, ++ uint16_t loop_id, uint16_t *mb_ret, uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) ++ ++ mcp->mb[0] = MBC_LOGIN_LOOP_PORT; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = (loop_id << 8); ++#endif ++ mcp->mb[2] = opt; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0; ++ mcp->tov = ha->login_timeout * 2; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return mailbox statuses. */ ++ if (mb_ret != NULL) { ++ mb_ret[0] = mcp->mb[0]; ++ mb_ret[1] = mcp->mb[1]; ++ mb_ret[6] = mcp->mb[6]; ++ mb_ret[7] = mcp->mb[7]; ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /* AV tmp code: need to change main mailbox_command function to ++ * return ok even when the mailbox completion value is not ++ * SUCCESS. The caller needs to be responsible to interpret ++ * the return values of this mailbox command if we're not ++ * to change too much of the existing code. ++ */ ++ if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006) ++ rval = QL_STATUS_SUCCESS; ++ ++ DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " ++ "mb[6]=%x mb[7]=%x.\n", ++ __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1], ++ mcp->mb[6], mcp->mb[7]);) ++ DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " ++ "mb[6]=%x mb[7]=%x.\n", ++ __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1], ++ mcp->mb[6], mcp->mb[7]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_fabric_logout ++ * Issue logout fabric port mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->out_mb = MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x " ++ "mbx1=%x.\n", ++ ha->host_no, rval, mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_full_login_lip ++ * Issue full login LIP mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_full_login_lip(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LIP_FULL_LOGIN; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = 0; ++ mcp->mb[3] = 0; ++ mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n", ++ ha->instance, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_port_list ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_port_list(scsi_qla_host_t *ha, port_list_entry_t *gp_list, ++ dma_addr_t gpl_phys_address, uint16_t opt, uint16_t *size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_port_list(%ld): entered.\n", ++ ha->host_no);) ++ ++ if( gp_list == NULL ) { ++ return QL_STATUS_ERROR; ++ } ++ ++ mcp->mb[0] = MBC_GET_PORT_LIST; ++ mcp->mb[1] = opt; ++ mcp->mb[2] = MSW(gpl_phys_address); ++ mcp->mb[3] = LSW(gpl_phys_address); ++ mcp->mb[6] = MSW(MSD(gpl_phys_address)); ++ mcp->mb[7] = LSW(MSD(gpl_phys_address)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_port_list(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ *size = mcp->mb[1]; ++ DEBUG11(printk("qla2x00_get_port_list(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++#if 0 /* not yet needed */ ++int ++qla2x00_dump_ram(scsi_qla_host_t *ha, uint32_t risc_address, ++ dma_addr_t ispdump_dma, uint32_t size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ mcp->mb[0] = MBC_DUMP_RAM; ++ mcp->mb[1] = risc_address & 0xffff; ++ mcp->mb[2] = MSW(ispdump_dma); ++ mcp->mb[3] = LSW(ispdump_dma); ++ mcp->mb[4] = 0; ++ mcp->mb[6] = MSW(MSD(ispdump_dma)); ++ mcp->mb[7] = LSW(MSD(ispdump_dma)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ return rval; ++} ++#endif ++ ++/* ++ * qla2x00_lun_reset ++ * Issue lun reset mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * lun = lun to be reset. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ ENTER("qla2x00_lun_reset"); ++ ++ mcp->mb[0] = MBC_LUN_RESET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = lun; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /*EMPTY*/ ++ printk(KERN_WARNING "qla2x00_lun_reset(%d): failed = %d", ++ (int)ha->instance, rval); ++ } else { ++ /*EMPTY*/ ++ LEAVE("qla2x00_lun_reset: exiting normally"); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_send_rnid_mbx ++ * Issue RNID ELS using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * loop_id = loop ID of the target device. ++ * data_fmt = currently supports only 0xDF. ++ * buffer = buffer pointer. ++ * buf_size = size of buffer. ++ * mb_reg = pointer to return mailbox registers. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_send_rnid_mbx(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t data_fmt, ++ dma_addr_t buf_phys_addr, size_t buf_size, uint16_t *mb_reg) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_SEND_RNID_ELS; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = (loop_id << 8 ) | data_fmt; ++#endif ++ mcp->mb[2] = MSW(buf_phys_addr); ++ mcp->mb[3] = LSW(buf_phys_addr); ++ mcp->mb[6] = MSW(MSD(buf_phys_addr)); ++ mcp->mb[7] = LSW(MSD(buf_phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = data_fmt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_IN; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */ ++ ++ DEBUG2_3_11(printk("qla2x00_send_rnid_mbx(%ld): failed=%x " ++ "mb[1]=%x.\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_set_rnid_params_mbx ++ * Set RNID parameters using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * buffer = buffer pointer. ++ * buf_size = size of buffer. ++ * mb_reg = pointer to return mailbox registers. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_set_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr, ++ size_t buf_size, uint16_t *mb_reg) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_SET_RNID_PARAMS; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = MSW(buf_phys_addr); ++ mcp->mb[3] = LSW(buf_phys_addr); ++ mcp->mb[6] = MSW(MSD(buf_phys_addr)); ++ mcp->mb[7] = LSW(MSD(buf_phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_OUT; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */ ++ ++ DEBUG2_3_11(printk("qla2x00_set_rnid_params_mbx(%ld): " ++ "failed=%x mb[1]=%x.\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_get_rnid_params_mbx ++ * Get RNID parameters using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * buffer = buffer pointer. ++ * buf_size = size of buffer. ++ * mb_reg = pointer to return mailbox registers. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr, ++ size_t buf_size, uint16_t *mb_reg) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_RNID_PARAMS; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = MSW(buf_phys_addr); ++ mcp->mb[3] = LSW(buf_phys_addr); ++ mcp->mb[6] = MSW(MSD(buf_phys_addr)); ++ mcp->mb[7] = LSW(MSD(buf_phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_IN; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */ ++ ++ DEBUG2_3_11(printk("qla2x00_get_rnid_params_mbx(%ld): " ++ "failed=%x mb[1]=%x.\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++#if defined(QL_DEBUG_LEVEL_3) ++/* ++ * qla2x00_get_fcal_position_map ++ * Get FCAL (LILP) position map using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pos_map = buffer pointer (can be NULL). ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ char *pmap; ++ dma_addr_t pmap_dma; ++ ++ pmap = pci_alloc_consistent(ha->pdev, FCAL_MAP_SIZE, &pmap_dma); ++ if (pmap == NULL) { ++ DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****", ++ __func__, ha->host_no)); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ memset(pmap, 0, FCAL_MAP_SIZE); ++ ++ mcp->mb[0] = MBC_GET_FCAL_MAP; ++ mcp->mb[2] = MSW(pmap_dma); ++ mcp->mb[3] = LSW(pmap_dma); ++ mcp->mb[6] = MSW(MSD(pmap_dma)); ++ mcp->mb[7] = LSW(MSD(pmap_dma)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = FCAL_MAP_SIZE; ++ mcp->flags = MBX_DMA_IN; ++ mcp->tov = ha->login_timeout * 2; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map " ++ "size (%x)\n", ++ __func__, ha->host_no, ++ mcp->mb[0], mcp->mb[1], (unsigned)pmap[0])); ++ DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1)); ++ ++ if (pos_map) ++ memcpy(pos_map, pmap, FCAL_MAP_SIZE); ++ } ++ pci_free_consistent(ha->pdev, FCAL_MAP_SIZE, pmap, pmap_dma); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ DEBUG11(printk("%s(%ld): done.\n", ++ __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_os.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,5879 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ */ ++#define QLA_MODVERSION ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++/* ++ * Driver version ++ */ ++char qla2x00_version_str[40] = { 0 }; ++ ++/* ++* Command line options. ++*/ ++unsigned long qla2x00_verbose = 1L; ++unsigned long qla2x00_quiet = 0L; ++unsigned long qla2x00_reinit = 1L; ++unsigned long qla2x00_req_dmp = 0L; ++ ++/* ++ * Stats for all adpaters. ++ */ ++struct _qla2x00stats qla2x00_stats; ++ ++/* ++ * Ioctl related information. ++ */ ++int num_hosts = 0; ++int apiHBAInstance = 0; ++ ++/* ++ * Module parameter information and variables ++ */ ++ ++char *ql2xdevconf = NULL; ++#if MPIO_SUPPORT ++int ql2xretrycount = 30; ++#else ++int ql2xretrycount = 20; ++#endif ++int qla2xenbinq = 1; ++int max_srbs = MAX_SRBS; ++#if defined(ISP2200) || defined(ISP2300) ++int ql2xlogintimeout = 20; ++int qlport_down_retry = 0; ++#endif ++int ql2xmaxqdepth = 0; ++int displayConfig = 0; ++ ++/* Enable for failover */ ++#if MPIO_SUPPORT ++int ql2xfailover = 1; ++#else ++int ql2xfailover = 0; ++#endif ++ ++int ConfigRequired = 0; ++int recoveryTime = MAX_RECOVERYTIME; ++int failbackTime = MAX_FAILBACKTIME; ++ ++/* Persistent binding type */ ++int Bind = BIND_BY_PORT_NAME; ++ ++int ql2xsuspendcount = SUSPEND_COUNT; ++ ++int qla2x00_retryq_dmp = 0; ++ ++#if defined(MODULE) ++char *ql2xopts = NULL; ++ ++static char dummy_buffer[60] = ++ "Please don't add commas in your insmod command!!\n"; ++ ++/* insmod qla2100 ql2xopts=verbose" */ ++MODULE_PARM(ql2xopts, "s"); ++MODULE_PARM_DESC(ql2xopts, ++ "Additional driver options."); ++ ++MODULE_PARM(ql2xfailover, "i"); ++MODULE_PARM_DESC(ql2xfailover, ++ "Driver failover support: 0 to disable; 1 to enable. " ++ "Default behaviour based on compile-time option " ++ "MPIO_SUPPORT."); ++ ++MODULE_PARM(ql2xmaxqdepth, "i"); ++MODULE_PARM_DESC(ql2xmaxqdepth, ++ "Maximum queue depth to report for target devices."); ++ ++#if defined(ISP2200) || defined(ISP2300) ++MODULE_PARM(ql2xlogintimeout,"i"); ++MODULE_PARM_DESC(ql2xlogintimeout, ++ "Login timeout value in seconds."); ++ ++MODULE_PARM(qlport_down_retry,"i"); ++MODULE_PARM_DESC(qlport_down_retry, ++ "Maximum number of command retries to a port that returns" ++ "a PORT-DOWN status."); ++#endif ++ ++MODULE_PARM(ql2xretrycount,"i"); ++MODULE_PARM_DESC(ql2xretrycount, ++ "Maximum number of mid-layer retries allowed for a command. " ++ "Default value in non-failover mode is 20, " ++ "in failover mode, 30."); ++ ++MODULE_PARM(max_srbs,"i"); ++MODULE_PARM_DESC(max_srbs, ++ "Maximum number of simultaneous commands allowed for an HBA."); ++ ++MODULE_PARM(displayConfig, "i"); ++MODULE_PARM_DESC(displayConfig, ++ "If 1 then display the configuration used in " ++ "/etc/modules.conf."); ++ ++MODULE_PARM(ConfigRequired, "i"); ++MODULE_PARM_DESC(ConfigRequired, ++ "If 1, then only configured devices passed in through the" ++ "ql2xopts parameter will be presented to the OS"); ++ ++MODULE_PARM(recoveryTime, "i"); ++MODULE_PARM_DESC(recoveryTime, ++ "Recovery time in seconds before a target device is sent I/O " ++ "after a failback is performed."); ++ ++MODULE_PARM(failbackTime, "i"); ++MODULE_PARM_DESC(failbackTime, ++ "Delay in seconds before a failback is performed."); ++ ++MODULE_PARM(Bind, "i"); ++MODULE_PARM_DESC(Bind, ++ "Target persistent binding method: " ++ "0 by Portname (default); 1 by PortID; 2 by Nodename. "); ++ ++MODULE_PARM(ql2xsuspendcount,"i"); ++MODULE_PARM_DESC(ql2xsuspendcount, ++ "Number of 6-second suspend iterations to perform while a " ++ "target returns a <NOT READY> status. Default is 10 " ++ "iterations."); ++#endif ++ ++MODULE_AUTHOR("QLogic Corporation"); ++MODULE_DESCRIPTION("QLogic " ISP_NAME " FC-SCSI Host Bus Adapter driver"); ++MODULE_LICENSE("GPL"); ++ ++ ++/* ++ * Proc structures and functions ++ */ ++struct info_str { ++ char *buffer; ++ int length; ++ off_t offset; ++ int pos; ++}; ++ ++static void copy_mem_info(struct info_str *, char *, int); ++static int copy_info(struct info_str *, char *, ...); ++ ++ ++/* ++ * List of host adapters ++ */ ++struct list_head qla_hostlist; ++rwlock_t qla_hostlist_lock; ++ ++ ++/* ++ * PCI driver interface definitions ++ */ ++#define ISP21XX_FW_INDEX 0 ++#define ISP22XX_FW_INDEX 0 ++#define ISP23XX_FW_INDEX 0 ++#define ISP232X_FW_INDEX 2 ++ ++static struct qla_fw_info qla_fw_tbl[] = { ++#if defined(ISP2100) ++ /* Start of 21xx firmware list */ ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2100tp_code01[0], ++ .fwlen = &fw2100tp_length01, ++ .fwstart = &fw2100tp_addr01, ++ }, ++#endif ++ ++#if defined(ISP2200) ++ /* Start of 22xx firmware list */ ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2200ip_code01[0], ++ .fwlen = &fw2200ip_length01, ++ .fwstart = &fw2200ip_addr01, ++ }, ++#endif ++ ++#if defined(ISP2300) ++ /* Start of 23xx firmware list */ ++#if defined(TPX) ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2300tpx_code01[0], ++ .fwlen = &fw2300tpx_length01, ++ .fwstart = &fw2300tpx_addr01, ++ }, ++#else ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2300ipx_code01[0], ++ .fwlen = &fw2300ipx_length01, ++ .fwstart = &fw2300ipx_addr01, ++ }, ++#endif ++ ++#if defined(ISP2322) ++ /* End of 23xx firmware list */ ++ { FW_INFO_ADDR_NOMORE, }, ++ ++ /* Start of 232x firmware list */ ++#if defined(TPX) ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2322tpx_code01[0], ++ .fwlen = &fw2322tpx_length01, ++ .fwstart = &fw2322tpx_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &rseqtpx_code01[0], ++ .fwlen = &rseqtpx_code_length01, ++ .lfwstart = &rseqtpx_code_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &xseqtpx_code01[0], ++ .fwlen = &xseqtpx_code_length01, ++ .lfwstart = &xseqtpx_code_addr01, ++ }, ++#else ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2322ipx_code01[0], ++ .fwlen = &fw2322ipx_length01, ++ .fwstart = &fw2322ipx_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &rseqipx_code01[0], ++ .fwlen = &rseqipx_code_length01, ++ .lfwstart = &rseqipx_code_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &xseqipx_code01[0], ++ .fwlen = &xseqipx_code_length01, ++ .lfwstart = &xseqipx_code_addr01, ++ }, ++#endif ++ ++#endif ++ ++#endif ++ ++ /* End of firmware list */ ++ { FW_INFO_ADDR_NOMORE, }, ++}; ++ ++#define ISP21XX_BRD_INDEX 0 ++#define ISP22XX_BRD_INDEX 0 ++#define ISP23XX_BRD_INDEX 0 ++#define ISP2312_BRD_INDEX 1 ++#define ISP2322_BRD_INDEX 2 ++ ++static struct qla_board_info qla_board_tbl[] = { ++#if defined(ISP2100) ++ { ++ .name = "QLA2100 ", ++ .fwinfo = &qla_fw_tbl[ISP21XX_FW_INDEX], ++ } ++#endif ++ ++#if defined(ISP2200) ++ { ++ .name = "QLA2200 ", ++ .fwinfo = &qla_fw_tbl[ISP22XX_FW_INDEX], ++ } ++#endif ++ ++#if defined(ISP2300) ++ { ++ .name = "QLA2300 ", ++ .fwinfo = &qla_fw_tbl[ISP23XX_FW_INDEX], ++ }, ++ ++ { ++ .name = "QLA2312 ", ++ .fwinfo = &qla_fw_tbl[ISP23XX_FW_INDEX], ++ }, ++ ++#if defined(ISP2322) ++ { ++ .name = "QLA2322 ", ++ .fwinfo = &qla_fw_tbl[ISP232X_FW_INDEX], ++ } ++#endif ++#endif ++}; ++ ++static struct pci_device_id qla_pci_tbl[] __devinitdata = { ++#if defined(ISP2100) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2100_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP21XX_BRD_INDEX], ++ }, ++#endif ++ ++#if defined(ISP2200) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2200_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP22XX_BRD_INDEX], ++ }, ++#endif ++ ++#if defined(ISP2300) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2300_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP23XX_BRD_INDEX], ++ }, ++ ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2312_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP2312_BRD_INDEX], ++ }, ++ ++#if defined(ISP2322) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2322_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP2322_BRD_INDEX], ++ }, ++#endif ++#endif ++ {0 , 0} ++}; ++MODULE_DEVICE_TABLE(pci, qla_pci_tbl); ++ ++static int __devinit qla_probe_device(struct pci_dev *, ++ const struct pci_device_id *); ++static void __devexit qla_remove_device(struct pci_dev *); ++static void qla2x00_free_device(scsi_qla_host_t *); ++ ++struct pci_driver qla_pci_driver = { ++ .name = DRIVER_NAME, ++ .id_table = qla_pci_tbl, ++ ++ .probe = qla_probe_device, ++ .remove = __devexit_p(qla_remove_device), ++}; ++ ++ ++/* ++ * SCSI host template entry points ++ */ ++static int qla2x00_detect(Scsi_Host_Template *); ++static int qla2x00_release(struct Scsi_Host *); ++static const char *qla2x00_info(struct Scsi_Host *); ++static int qla2xxx_slave_configure(Scsi_Device * device); ++static int qla2x00_biosparam(struct scsi_device *, ++ struct block_device *, sector_t, int[]); ++extern int qla2x00_ioctl(Scsi_Device *, int , void *); ++static int qla2xxx_eh_abort(Scsi_Cmnd *); ++static int qla2xxx_eh_device_reset(Scsi_Cmnd *); ++static int qla2xxx_eh_bus_reset(Scsi_Cmnd *); ++static int qla2xxx_eh_host_reset(Scsi_Cmnd *); ++static uint8_t qla2x00_loop_reset(scsi_qla_host_t *ha); ++static int qla2x00_device_reset(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++static int qla2x00_proc_info(char *, char **, off_t, int, int, int); ++ ++static uint8_t qla2x00_register_with_Linux(scsi_qla_host_t *, uint8_t); ++ ++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) ++int qla2x00_get_scsi_info_from_wwn(int mode, unsigned long long wwn, int *host, int *channel, int *lun, int *id); ++int qla2x00_get_wwn_from_scsi_info(int host, int id, unsigned long long *wwn); ++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ ++ ++#if !defined(MODULE) ++static int __init qla2x00_setup(char *); ++#else ++static void qla2x00_setup(char *); ++#endif ++static char *qla2x00_get_line(char *, char *); ++static int qla2x00_get_tokens(char *, char **, int); ++ ++ ++static Scsi_Host_Template qla2x00_driver_template = { ++ .module = THIS_MODULE, ++ .name = DRIVER_NAME, ++ .proc_name = DRIVER_NAME, ++ .proc_info = qla2x00_proc_info, ++ .detect = qla2x00_detect, ++ .release = qla2x00_release, ++ .info = qla2x00_info, ++ .ioctl = qla2x00_ioctl, ++ .queuecommand = qla2x00_queuecommand, ++ ++ .eh_abort_handler = qla2xxx_eh_abort, ++ .eh_device_reset_handler = qla2xxx_eh_device_reset, ++ .eh_bus_reset_handler = qla2xxx_eh_bus_reset, ++ .eh_host_reset_handler = qla2xxx_eh_host_reset, ++ .bios_param = qla2x00_biosparam, ++ ++ .slave_configure = qla2xxx_slave_configure, ++ ++ .this_id = -1, ++ .can_queue = 255, ++ .cmd_per_lun = 3, ++ .sg_tablesize = SG_ALL, ++ .use_clustering = ENABLE_CLUSTERING, ++ .unchecked_isa_dma = 0, ++ .max_sectors = 8192, ++ .highmem_io = 1, ++}; ++ ++static void qla2x00_display_fc_names(scsi_qla_host_t *); ++ ++/* TODO Convert to inlines ++ * ++ * Timer routines ++ */ ++#define WATCH_INTERVAL 1 /* number of seconds */ ++ ++static void qla2x00_timer(scsi_qla_host_t *); ++ ++static __inline__ void qla2x00_start_timer(scsi_qla_host_t *, ++ void *, unsigned long); ++static __inline__ void qla2x00_restart_timer(scsi_qla_host_t *, unsigned long); ++static __inline__ void qla2x00_stop_timer(scsi_qla_host_t *); ++ ++static inline void ++qla2x00_start_timer(scsi_qla_host_t *ha, void *func, unsigned long interval) ++{ ++ init_timer(&ha->timer); ++ ha->timer.expires = jiffies + interval * HZ; ++ ha->timer.data = (unsigned long)ha; ++ ha->timer.function = (void (*)(unsigned long))func; ++ add_timer(&ha->timer); ++ ha->timer_active = 1; ++} ++ ++static inline void ++qla2x00_restart_timer(scsi_qla_host_t *ha, unsigned long interval) ++{ ++ mod_timer(&ha->timer, jiffies + interval * HZ); ++} ++ ++static __inline__ void ++qla2x00_stop_timer(scsi_qla_host_t *ha) ++{ ++ del_timer_sync(&ha->timer); ++ ha->timer_active = 0; ++} ++ ++ ++static void qla2x00_cmd_timeout(srb_t *sp); ++static __inline__ void qla2x00_add_timer_to_cmd(srb_t *sp, int timeout); ++static __inline__ void qla2x00_delete_timer_from_cmd(srb_t *sp); ++ ++/************************************************************************** ++* qla2x00_add_timer_to_cmd ++* ++* Description: ++* Creates a timer for the specified command. The timeout is usually ++* the command time from kernel minus 2 secs. ++* ++* Input: ++* sp - pointer to validate ++* ++* Returns: ++* None. ++**************************************************************************/ ++static inline void ++qla2x00_add_timer_to_cmd(srb_t *sp, int timeout) ++{ ++ init_timer(&sp->timer); ++ sp->timer.expires = jiffies + timeout * HZ; ++ sp->timer.data = (unsigned long) sp; ++ sp->timer.function = (void (*) (unsigned long))qla2x00_cmd_timeout; ++ add_timer(&sp->timer); ++} ++ ++/************************************************************************** ++* qla2x00_delete_timer_from_cmd ++* ++* Description: ++* Delete the timer for the specified command. ++* ++* Input: ++* sp - pointer to validate ++* ++* Returns: ++* None. ++**************************************************************************/ ++static inline void ++qla2x00_delete_timer_from_cmd(srb_t *sp) ++{ ++ if (sp->timer.function != NULL) { ++ del_timer(&sp->timer); ++ sp->timer.function = NULL; ++ sp->timer.data = (unsigned long) NULL; ++ } ++} ++ ++static __inline__ void qla2x00_callback(scsi_qla_host_t *, Scsi_Cmnd *); ++static __inline__ void sp_put(struct scsi_qla_host * ha, srb_t *sp); ++static __inline__ void sp_get(struct scsi_qla_host * ha, srb_t *sp); ++static __inline__ void __sp_put(struct scsi_qla_host * ha, srb_t *sp); ++static __inline__ void ++qla2x00_delete_from_done_queue(scsi_qla_host_t *, srb_t *); ++ ++/************************************************************************** ++* sp_put ++* ++* Description: ++* Decrement reference count and call the callback if we're the last ++* owner of the specified sp. Will get io_request_lock before calling ++* the callback. ++* ++* Input: ++* ha - pointer to the scsi_qla_host_t where the callback is to occur. ++* sp - pointer to srb_t structure to use. ++* ++* Returns: ++* ++**************************************************************************/ ++static inline void ++sp_put(struct scsi_qla_host * ha, srb_t *sp) ++{ ++ unsigned long flags; ++ ++ if (atomic_read(&sp->ref_count) == 0) { ++ printk(KERN_INFO ++ "%s(): **** SP->ref_count not zero\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return; ++ } ++ ++ if (!atomic_dec_and_test(&sp->ref_count)) ++ { ++ return; ++ } ++ ++ spin_lock_irqsave(ha->host->host_lock, flags); ++ ++ qla2x00_callback(ha, sp->cmd); ++ ++ spin_unlock_irqrestore(ha->host->host_lock, flags); ++} ++ ++/************************************************************************** ++* sp_get ++* ++* Description: ++* Increment reference count of the specified sp. ++* ++* Input: ++* sp - pointer to srb_t structure to use. ++* ++* Returns: ++* ++**************************************************************************/ ++static inline void ++sp_get(struct scsi_qla_host * ha, srb_t *sp) ++{ ++ atomic_inc(&sp->ref_count); ++ ++ if (atomic_read(&sp->ref_count) > 2) { ++ printk(KERN_INFO ++ "%s(): **** SP->ref_count greater than two\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return; ++ } ++} ++ ++/************************************************************************** ++* __sp_put ++* ++* Description: ++* Decrement reference count and call the callback if we're the last ++* owner of the specified sp. Will NOT get io_request_lock before calling ++* the callback. ++* ++* Input: ++* ha - pointer to the scsi_qla_host_t where the callback is to occur. ++* sp - pointer to srb_t structure to use. ++* ++* Returns: ++* ++**************************************************************************/ ++static inline void ++__sp_put(struct scsi_qla_host * ha, srb_t *sp) ++{ ++ if (atomic_read(&sp->ref_count) == 0) { ++ printk(KERN_INFO ++ "%s(): **** SP->ref_count not zero\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return; ++ } ++ ++ if (!atomic_dec_and_test(&sp->ref_count)) ++ { ++ return; ++ } ++ ++ qla2x00_callback(ha, sp->cmd); ++} ++ ++ ++/* ++* qla2x00_callback ++* Returns the completed SCSI command to LINUX. ++* ++* Input: ++* ha -- Host adapter structure ++* cmd -- SCSI mid-level command structure. ++* Returns: ++* None ++* Note:From failover point of view we always get the sp ++* from vis_ha pool in queuecommand.So when we put it ++* back to the pool it has to be the vis_ha. ++* So rely on Scsi_Cmnd to get the vis_ha and not on sp. ++*/ ++static inline void ++qla2x00_callback(scsi_qla_host_t *ha, Scsi_Cmnd *cmd) ++{ ++ srb_t *sp = (srb_t *) CMD_SP(cmd); ++ scsi_qla_host_t *vis_ha; ++ os_lun_t *lq; ++ int got_sense; ++ unsigned long cpu_flags = 0; ++ ++ ENTER(__func__); ++ ++ CMD_HANDLE(cmd) = (unsigned char *) NULL; ++ vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata; ++ ++ if (sp == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL SP\n", ++ __func__); ++ DEBUG2(BUG();) ++ return; ++ } ++ ++ /* ++ * If command status is not DID_BUS_BUSY then go ahead and freed sp. ++ */ ++ /* ++ * Cancel command timeout ++ */ ++ qla2x00_delete_timer_from_cmd(sp); ++ ++ /* ++ * Put SP back in the free queue ++ */ ++ sp->cmd = NULL; ++ CMD_SP(cmd) = NULL; ++ lq = sp->lun_queue; ++ got_sense = (sp->flags & SRB_GOT_SENSE)? 1: 0; ++ add_to_free_queue(vis_ha, sp); ++ ++ if ((CMD_RESULT(cmd)>>16) == DID_OK) { ++ /* device ok */ ++ ha->total_bytes += cmd->bufflen; ++ if (!got_sense) { ++ /* If lun was suspended then clear retry count */ ++ spin_lock_irqsave(&lq->q_lock, cpu_flags); ++ if (!test_bit(LUN_EXEC_DELAYED, &lq->q_flag)) ++ lq->q_state = LUN_STATE_READY; ++ spin_unlock_irqrestore(&lq->q_lock, cpu_flags); ++ } ++ } else if ((CMD_RESULT(cmd)>>16) == DID_ERROR) { ++ /* device error */ ++ ha->total_dev_errs++; ++ } ++ ++ if (cmd->flags & IS_RESETTING) { ++ CMD_RESULT(cmd) = (int)DID_RESET << 16; ++ } ++ ++ /* Call the mid-level driver interrupt handler */ ++ (*(cmd)->scsi_done)(cmd); ++ ++ LEAVE(__func__); ++} ++ ++static inline void ++qla2x00_delete_from_done_queue(scsi_qla_host_t *dest_ha, srb_t *sp) ++{ ++ /* remove command from done list */ ++ list_del_init(&sp->list); ++ dest_ha->done_q_cnt--; ++ sp->state = SRB_NO_QUEUE_STATE; ++ ++ if (sp->flags & SRB_DMA_VALID) { ++ sp->flags &= ~SRB_DMA_VALID; ++ ++ /* Release memory used for this I/O */ ++ if (sp->cmd->use_sg) { ++ pci_unmap_sg(dest_ha->pdev, ++ sp->cmd->request_buffer, ++ sp->cmd->use_sg, ++ scsi_to_pci_dma_dir( ++ sp->cmd->sc_data_direction)); ++ } else if (sp->cmd->request_bufflen) { ++ pci_unmap_page(dest_ha->pdev, ++ sp->saved_dma_handle, ++ sp->cmd->request_bufflen, ++ scsi_to_pci_dma_dir( ++ sp->cmd->sc_data_direction)); ++ } ++ } ++} ++ ++static int qla2x00_do_dpc(void *data); ++static uint8_t qla2x00_check_for_devices_online(scsi_qla_host_t *); ++ ++static void qla2x00_rst_aen(scsi_qla_host_t *); ++static void qla2x00_done_work(void *); ++ ++static void qla2x00_process_failover(scsi_qla_host_t *); ++ ++static uint8_t qla2x00_mem_alloc(scsi_qla_host_t *); ++static void qla2x00_mem_free(scsi_qla_host_t *ha); ++uint8_t qla2x00_allocate_sp_pool( scsi_qla_host_t *ha); ++void qla2x00_free_sp_pool(scsi_qla_host_t *ha); ++ ++ ++static int apidev_init(struct Scsi_Host *); ++static int apidev_cleanup(void); ++static int apidev_open(struct inode *, struct file *); ++static int apidev_close(struct inode *, struct file *); ++static int apidev_ioctl(struct inode *, ++ struct file *, unsigned int, unsigned long arg); ++ ++/************************************************************************* ++* qla2x00_set_info ++* ++* Description: ++* Set parameters for the driver from the /proc filesystem. ++* ++* Returns: ++*************************************************************************/ ++int ++qla2x00_set_info(char *buffer, int length, struct Scsi_Host *shost) ++{ ++ return (-ENOSYS); /* Currently this is a no-op */ ++} ++ ++/************************************************************************** ++* qla2x00_detect ++* ++* Description: ++* This routine will probe for Qlogic FC SCSI host adapters. ++* It returns the number of host adapters of a particular ++* type that were found. It also initialize all data necessary for ++* the driver. It is passed-in the host number, so that it ++* knows where its first entry is in the scsi_hosts[] array. ++* ++* Input: ++* template - pointer to SCSI template ++* ++* Returns: ++* num - number of host adapters found. ++**************************************************************************/ ++int ++qla2x00_detect(Scsi_Host_Template *template) ++{ ++#if defined(MODULE) ++ DEBUG2(printk("DEBUG: qla2x00_set_info() starts at address = %p\n", ++ qla2x00_set_info)); ++ printk(KERN_INFO ++ "qla2x00_set_info() starts at address = %p\n", ++ qla2x00_set_info); ++ ++ /* ++ * If we are called as a module, the qla2100 pointer may not be null ++ * and it would point to our bootup string, just like on the lilo ++ * command line. IF not NULL, then process this config string with ++ * qla2x00_setup ++ * ++ * Boot time Options To add options at boot time add a line to your ++ * lilo.conf file like: ++ * append="qla2100=verbose,tag_info:{{32,32,32,32},{32,32,32,32}}" ++ * which will result in the first four devices on the first two ++ * controllers being set to a tagged queue depth of 32. ++ */ ++ if (ql2xopts) ++ qla2x00_setup(ql2xopts); ++ if (dummy_buffer[0] != 'P') ++ printk(KERN_WARNING ++ "qla2x00: Please read the file " ++ "/usr/src/linux/drivers/scsi/README.qla2x00\n" ++ "qla2x00: to see the proper way to specify options to " ++ "the qla2x00 module\n" ++ "qla2x00: Specifically, don't use any commas when passing " ++ "arguments to\n" ++ "qla2x00: insmod or else it might trash certain memory " ++ "areas.\n"); ++#endif ++ ++ rwlock_init(&qla_hostlist_lock); ++ INIT_LIST_HEAD(&qla_hostlist); ++ ++ pci_module_init(&qla_pci_driver); ++ ++ return (num_hosts); ++} ++ ++/************************************************************************** ++* qla2x00_register_with_Linux ++* ++* Description: ++* Free the passed in Scsi_Host memory structures prior to unloading the ++* module. ++* ++* Input: ++* ha - pointer to host adapter structure ++* maxchannels - MAX number of channels. ++* ++* Returns: ++* 0 - Sucessfully reserved resources. ++* 1 - Failed to reserved a resource. ++**************************************************************************/ ++static uint8_t ++qla2x00_register_with_Linux(scsi_qla_host_t *ha, uint8_t maxchannels) ++{ ++ struct Scsi_Host *host = ha->host; ++ ++ host->can_queue = max_srbs; /* default value:-MAX_SRBS(4096) */ ++ host->cmd_per_lun = 3; ++ host->max_cmd_len = MAX_CMDSZ; ++ ++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) ++ host->hostt->get_scsi_info_from_wwn = qla2x00_get_scsi_info_from_wwn; ++ host->hostt->get_wwn_from_scsi_info = qla2x00_get_wwn_from_scsi_info; ++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ ++ ++ host->n_io_port = 0xFF; ++ ++#if MEMORY_MAPPED_IO ++ host->base = (unsigned long)ha->mmpbase; ++#else ++ host->base = 0; ++#endif ++ ++ host->max_channel = maxchannels; ++ host->max_lun = ha->max_luns; ++ host->unique_id = ha->instance; ++ host->max_id = ha->max_targets; ++ ++ /* set our host ID (need to do something about our two IDs) */ ++ host->this_id = 255; ++ ++#if defined(CONFIG_MD_MULTIHOST_FC) ++ { ++ unsigned long i; ++ unsigned long j; ++ ++ union { ++ __u64 identifier; ++ char wwn[WWN_SIZE]; ++ } foo; ++ ++ for (i = 0, j = WWN_SIZE-1; i < WWN_SIZE; i++, j--) { ++ foo.wwn[i] = ha->init_cb->port_name[j]; ++ } ++ ++ host->fc_wwn = foo.identifier; ++ } ++#endif /* CONFIG_MD_MULTIHOST_FC */ ++ ++ /* Register the I/O space with Linux */ ++ if (request_region(host->io_port, 0xff, DRIVER_NAME) == 0) { ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to reserved i/o base region " ++ "0x%04lx-0x%04lx already in use\n", ++ ha->host_no, ++ host->io_port, host->io_port + 0xff); ++ return 1; ++ } ++ ++ /* Register the IRQ with Linux (sharable) */ ++ if (request_irq(host->irq, qla2x00_intr_handler, ++ SA_INTERRUPT|SA_SHIRQ, DRIVER_NAME, ha)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to reserve interrupt %d already in " ++ "use\n", ++ ha->host_no, host->irq); ++ release_region(host->io_port, 0xff); ++ return 1; ++ } ++ ++ /* Initialized the timer */ ++ qla2x00_start_timer(ha, qla2x00_timer, WATCH_INTERVAL); ++ ++ return 0; ++} ++ ++ ++/************************************************************************** ++* qla2x00_release ++* ++* Description: ++* Free the passed in Scsi_Host memory structures prior to unloading the ++* module. ++* ++* Input: ++* ha - pointer to host adapter structure ++* ++* Returns: ++* 0 - Always returns good status ++**************************************************************************/ ++int ++qla2x00_release(struct Scsi_Host *host) ++{ ++ scsi_qla_host_t *ha; ++ ++ if (host != NULL) { ++ ha = (scsi_qla_host_t *)host->hostdata; ++ list_del(&ha->list); ++ qla2x00_free_device(ha); ++ } ++ ++ if (list_empty(&qla_hostlist)) ++ pci_unregister_driver(&qla_pci_driver); ++ ++ return 0; ++} ++ ++/************************************************************************** ++* qla2x00_info ++* ++* Description: ++* ++* Input: ++* host - pointer to Scsi host adapter structure ++* ++* Returns: ++* Return a text string describing the driver. ++**************************************************************************/ ++const char * ++qla2x00_info(struct Scsi_Host *host) ++{ ++ static char qla2x00_buffer[255]; ++ char *bp; ++ scsi_qla_host_t *ha; ++ ++ /* ++ * We must create the api node here instead of qla2x00_detect since we ++ * want the api node to be subdirectory of /proc/scsi/qla2x00 which ++ * will not have been created when qla2x00_detect exits, but which will ++ * have been created by this point. ++ */ ++ apidev_init(host); ++ ++ bp = &qla2x00_buffer[0]; ++ ha = (scsi_qla_host_t *)host->hostdata; ++ memset(bp, 0, sizeof(qla2x00_buffer)); ++ ++ sprintf(bp, ++ "QLogic %sPCI to Fibre Channel Host Adapter: bus %d device %d " ++ "irq %d\n Firmware version: %2d.%02d.%02d, " ++ "Driver version %s\n", ++ ha->brd_info->name, ++ ha->pdev->bus->number, ++ PCI_SLOT(ha->pdev->devfn), ++ host->irq, ++ ha->fw_major_version, ++ ha->fw_minor_version, ++ ha->fw_subminor_version, ++ qla2x00_version_str); ++ ++ return bp; ++} ++ ++/************************************************************************** ++* qla2x00_queuecommand ++* ++* Description: ++* Queue a command to the controller. ++* ++* Input: ++* cmd - pointer to Scsi cmd structure ++* fn - pointer to Scsi done function ++* ++* Returns: ++* 0 - Always ++* ++* Note: ++* The mid-level driver tries to ensures that queuecommand never gets invoked ++* concurrently with itself or the interrupt handler (although the ++* interrupt handler may call this routine as part of request-completion ++* handling). ++**************************************************************************/ ++int ++qla2x00_queuecommand(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *)) ++{ ++ fc_port_t *fcport; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ scsi_qla_host_t *ha, *ha2; ++ srb_t *sp; ++ struct Scsi_Host *host; ++ uint32_t b, t, l; ++#if BITS_PER_LONG <= 32 ++ uint32_t handle; ++#else ++ u_long handle; ++#endif ++ ++ ENTER(__func__); ++ ++ host = cmd->device->host; ++ ha = (scsi_qla_host_t *) host->hostdata; ++ ++ cmd->scsi_done = fn; ++ ++ spin_unlock(ha->host->host_lock); ++ ++ /* ++ * Allocate a command packet from the "sp" pool. If we cant get back ++ * one then let scsi layer come back later. ++ */ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Couldn't allocate memory for sp - retried.\n", ++ ha->host_no); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ LEAVE(__func__); ++ return (1); ++ } ++ ++ sp->cmd = cmd; ++ CMD_SP(cmd) = (void *)sp; ++ ++ sp->flags = 0; ++ if (CMD_RESID_LEN(cmd) & SRB_IOCTL) { ++ /* Need to set sp->flags */ ++ sp->flags |= SRB_IOCTL; ++ CMD_RESID_LEN(cmd) = 0; /* Clear it since no more use. */ ++ } ++ ++ sp->fo_retry_cnt = 0; ++#if defined(IOCB_THROLLE_USAGE) ++ sp->iocb_cnt = 0; ++#endif ++ ++ if (cmd->allowed < ql2xretrycount) { ++ cmd->allowed = ql2xretrycount; ++ } ++ ++ /* Generate LU queue on bus, target, LUN */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ /* ++ * Start Command Timer. Typically it will be 2 seconds less than what ++ * is requested by the Host such that we can return the IO before ++ * aborts are called. ++ */ ++ if ((CMD_TIMEOUT(cmd)/HZ) > QLA_CMD_TIMER_DELTA) ++ qla2x00_add_timer_to_cmd(sp, ++ (CMD_TIMEOUT(cmd)/HZ) - QLA_CMD_TIMER_DELTA); ++ else ++ qla2x00_add_timer_to_cmd(sp, (CMD_TIMEOUT(cmd)/HZ)); ++ ++ if (l >= ha->max_luns) { ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ __sp_put(ha, sp); ++ LEAVE(__func__); ++ ++ return (0); ++ } ++ ++ if ((tq = (os_tgt_t *) TGT_Q(ha, t)) != NULL && ++ (lq = (os_lun_t *) LUN_Q(ha, t, l)) != NULL ) { ++ ++ fcport = lq->fclun->fcport; ++ ha2 = fcport->ha; ++ } else { ++ lq = NULL; ++ fcport = NULL; ++ ha2 = ha; ++ } ++ ++ /* Set an invalid handle until we issue the command to ISP */ ++ /* then we will set the real handle value. */ ++ handle = INVALID_HANDLE; ++ CMD_HANDLE(cmd) = (unsigned char *)handle; ++ ++ /* Bookkeeping information */ ++ sp->r_start = jiffies; /* time the request was recieved */ ++ sp->u_start = 0; ++ ++ /* Setup device queue pointers. */ ++ sp->tgt_queue = tq; ++ sp->lun_queue = lq; ++ ++ /* ++ * NOTE : q is NULL ++ * ++ * 1. When device is added from persistent binding but has not been ++ * discovered yet.The state of loopid == PORT_AVAIL. ++ * 2. When device is never found on the bus.(loopid == UNUSED) ++ * ++ * IF Device Queue is not created, or device is not in a valid state ++ * and link down error reporting is enabled, reject IO. ++ */ ++ if (fcport == NULL) { ++ DEBUG3(printk("scsi(%ld:%2d:%2d): port unavailable\n", ++ ha->host_no,t,l)); ++ ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ __sp_put(ha, sp); ++ ++ return (0); ++ } ++ ++ DEBUG5(printk("scsi(%ld:%2d:%2d): (queuecmd) queue sp = %p, " ++ "flags=0x%x fo retry=%d, pid=%ld, cmd flags= 0x%x\n", ++ ha->host_no, ++ t, l, ++ sp, sp->flags, sp->fo_retry_cnt, ++ cmd->serial_number,cmd->flags)); ++ DEBUG5(qla2x00_print_scsi_cmd(cmd)); ++ ++ sp->flags &= ~SRB_ISP_COMPLETED; ++ ++ sp->fclun = lq->fclun; ++ sp->ha = ha2; ++ ++ sp->cmd_length = CMD_CDBLEN(cmd); ++ ++ if (cmd->sc_data_direction == SCSI_DATA_UNKNOWN && ++ cmd->request_bufflen != 0) { ++ ++ DEBUG2(printk(KERN_WARNING ++ "scsi(%ld): Incorrect data direction - transfer " ++ "length=%d, direction=%d, pid=%ld, opcode=%x\n", ++ ha->host_no, ++ cmd->request_bufflen, ++ cmd->sc_data_direction, ++ cmd->serial_number, ++ cmd->cmnd[0])); ++ } ++ ++ /* Final pre-check */ ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) { ++ /* ++ * Add the command to the done-queue for later failover ++ * processing ++ */ ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ add_to_done_queue(ha, sp); ++ schedule_work(&ha->run_qla_task); ++ ++ spin_lock_irq(ha->host->host_lock); ++ return (0); ++ } ++ ++ add_to_pending_queue(ha, sp); ++ ++ /* First start cmds for this lun if possible */ ++ qla2x00_next(ha); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ LEAVE(__func__); ++ return (0); ++} ++ ++/* ++ * qla2x00_eh_wait_on_command ++ * Waits for the command to be returned by the Firmware for some ++ * max time. ++ * ++ * Input: ++ * ha = actual ha whose done queue will contain the command ++ * returned by firmware. ++ * cmd = Scsi Command to wait on. ++ * flag = Abort/Reset(Bus or Device Reset) ++ * ++ * Return: ++ * Not Found : 0 ++ * Found : 1 ++ */ ++static int ++qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, Scsi_Cmnd *cmd) ++{ ++#define ABORT_WAIT_TIME 10 /* seconds */ ++#define EH_ACTIVE 1 /* Error Handler Active */ ++ ++ int found = 0; ++ int done = 0; ++ srb_t *rp; ++ struct list_head *list, *temp; ++ u_long cpu_flags = 0; ++ u_long max_wait_time = ABORT_WAIT_TIME; ++ ++ ENTER(__func__); ++ ++ do { ++ /* Check on done queue */ ++ if (!found) { ++ spin_lock_irqsave(&ha->list_lock, cpu_flags); ++ list_for_each_safe(list, temp, &ha->done_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ /* ++ * Found command. Just exit and wait for the ++ * cmd sent to OS. ++ */ ++ if (cmd == rp->cmd) { ++ found++; ++ DEBUG3(printk("%s: found in done " ++ "queue.\n", __func__);) ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&ha->list_lock, cpu_flags); ++ } ++ ++ /* Checking to see if its returned to OS */ ++ rp = (srb_t *) CMD_SP(cmd); ++ if (rp == NULL ) { ++ done++; ++ break; ++ } ++ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(2*HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ } while ((max_wait_time--)); ++ ++ DEBUG2(if (done)) ++ DEBUG2(printk("%s: found cmd=%p.\n", __func__, cmd);) ++ ++ LEAVE(__func__); ++ ++ return(done); ++} ++ ++/************************************************************************** ++* qla2xxx_eh_abort ++* ++* Description: ++* The abort function will abort the specified command. ++* ++* Input: ++* cmd = Linux SCSI command packet to be aborted. ++* ++* Returns: ++* Either SUCCESS or FAILED. ++* ++* Note: ++**************************************************************************/ ++int ++qla2xxx_eh_abort(Scsi_Cmnd *cmd) ++{ ++ int i; ++ int return_status = FAILED; ++ os_lun_t *q; ++ scsi_qla_host_t *ha; ++ scsi_qla_host_t *vis_ha; ++ srb_t *sp; ++ srb_t *rp; ++ struct list_head *list, *temp; ++ struct Scsi_Host *host; ++ uint8_t found = 0; ++ uint32_t b, t, l; ++ unsigned long flags; ++ ++ ++ ENTER("qla2xxx_eh_abort"); ++ ++ /* Get the SCSI request ptr */ ++ sp = (srb_t *) CMD_SP(cmd); ++ ++ /* ++ * If sp is NULL, command is already returned. ++ * sp is NULLed just before we call back scsi_done ++ * ++ */ ++ if ((sp == NULL)) { ++ /* no action - we don't have command */ ++ DEBUG(printk("qla2xxx_eh_abort: cmd already done sp=%p\n",sp);) ++ return(SUCCESS); ++ } ++ if (sp) { ++ DEBUG(printk("qla2xxx_eh_abort: refcount %i \n", ++ atomic_read(&sp->ref_count));) ++ } ++ ++ vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata; ++ vis_ha->eh_start=0; ++ if (vis_ha->flags.failover_enabled) ++ /* Get Actual HA pointer */ ++ ha = (scsi_qla_host_t *)sp->ha; ++ else ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++ host = ha->host; ++ ++ /* Generate LU queue on bus, target, LUN */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ q = GET_LU_Q(vis_ha, t, l); ++ ++ /* ++ * if no LUN queue then something is very wrong!!! ++ */ ++ if (q == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: (%x:%x:%x) No LUN queue.\n", b, t, l); ++ ++ /* no action - we don't have command */ ++ return(FAILED); ++ } ++ ++ DEBUG2(printk("scsi(%ld): ABORTing cmd=%p sp=%p jiffies = 0x%lx, " ++ "timeout=%x, dpc_flags=%lx, vis_ha->dpc_flags=%lx\n", ++ ha->host_no, ++ cmd, ++ sp, ++ jiffies, ++ CMD_TIMEOUT(cmd)/HZ, ++ ha->dpc_flags, ++ vis_ha->dpc_flags);) ++ DEBUG2(qla2x00_print_scsi_cmd(cmd)); ++ DEBUG2(qla2x00_print_q_info(q);) ++ ++ /* Search done queue */ ++ spin_lock_irqsave(&ha->list_lock,flags); ++ list_for_each_safe(list, temp, &ha->done_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ if (cmd != rp->cmd) ++ continue; ++ ++ /* ++ * Found command. No need to remove command from done list. ++ * Just proceed to call done. ++ */ ++ return_status = SUCCESS; ++ found++; ++ qla2x00_delete_from_done_queue(ha, sp); ++ ++ break; ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ /* ++ * Return immediately if the aborted command was already in the done ++ * queue ++ */ ++ if (found) { ++ printk(KERN_INFO "qla2xxx_eh_abort: Returning completed " ++ "command=%p sp=%p\n", cmd, sp); ++ __sp_put(ha, sp); ++ return (return_status); ++ } ++ ++ ++ /* ++ * See if this command is in the retry queue ++ */ ++ if (!found) { ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in retry queue.\n", sp);) ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->retry_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ if (cmd != rp->cmd) ++ continue; ++ ++ ++ DEBUG2(printk("qla2xxx_eh_abort: found " ++ "in retry queue. SP=%p\n", sp);) ++ ++ __del_from_retry_queue(ha, rp); ++ CMD_RESULT(rp->cmd) = DID_ABORT << 16; ++ __add_to_done_queue(ha, rp); ++ ++ return_status = SUCCESS; ++ found++; ++ ++ break; ++ ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ } ++ ++ /* ++ * Search failover queue ++ */ ++ if (ha->flags.failover_enabled) { ++ if (!found) { ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in failover queue.\n", sp);) ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->failover_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ if (cmd != rp->cmd) ++ continue; ++ ++ DEBUG2(printk(KERN_WARNING ++ "qla2xxx_eh_abort: found " ++ "in failover queue. SP=%p\n", ++ sp);) ++ ++ /* Remove srb from failover queue. */ ++ __del_from_failover_queue(ha, rp); ++ CMD_RESULT(rp->cmd) = DID_ABORT << 16; ++ __add_to_done_queue(ha, rp); ++ ++ return_status = SUCCESS; ++ found++; ++ ++ break; ++ ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ } /*End of if !found */ ++ } ++ ++ /* ++ * Our SP pointer points at the command we want to remove from the ++ * pending queue providing we haven't already sent it to the adapter. ++ */ ++ if (!found) { ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in pending queue.\n", sp);) ++ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ list_for_each_safe(list, temp, &vis_ha->pending_queue) { ++ rp = list_entry(list, srb_t, list); ++ if (rp->cmd != cmd) ++ continue; ++ ++ /* Remove srb from LUN queue. */ ++ rp->flags |= SRB_ABORTED; ++ ++ DEBUG2(printk("qla2xxx_eh_abort: Cmd in pending queue." ++ " serial_number %ld.\n", ++ sp->cmd->serial_number);) ++ ++ __del_from_pending_queue(vis_ha, rp); ++ CMD_RESULT(cmd) = DID_ABORT << 16; ++ ++ __add_to_done_queue(vis_ha, rp); ++ ++ return_status = SUCCESS; ++ ++ found++; ++ break; ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ } /*End of if !found */ ++ ++ if (!found) { /* find the command in our active list */ ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in outstanding queue.\n", sp);) ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ sp = ha->outstanding_cmds[i]; ++ ++ if (sp == NULL) ++ continue; ++ ++ if (sp->cmd != cmd) ++ continue; ++ ++ ++ DEBUG2(printk("qla2xxx_eh_abort(%ld): aborting sp %p " ++ "from RISC. pid=%d sp->state=%x\n", ++ ha->host_no, ++ sp, ++ (int)sp->cmd->serial_number, ++ sp->state);) ++ DEBUG(qla2x00_print_scsi_cmd(cmd);) ++ DEBUG(qla2x00_print_q_info(q);) ++ ++ /* Get a reference to the sp and drop the lock.*/ ++ sp_get(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ spin_unlock(ha->host->host_lock); ++ ++ if (qla2x00_abort_command(ha, sp)) { ++ DEBUG2(printk("qla2xxx_eh_abort: abort_command " ++ "mbx failed.\n");) ++ return_status = FAILED; ++ } else { ++ DEBUG3(printk("qla2xxx_eh_abort: abort_command " ++ " mbx success.\n");) ++ return_status = SUCCESS; ++ } ++ ++ sp_put(ha,sp); ++ ++ spin_lock_irq(ha->host->host_lock); ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* ++ * Regardless of mailbox command status, go check on ++ * done queue just in case the sp is already done. ++ */ ++ break; ++ ++ }/*End of for loop */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ } /*End of if !found */ ++ ++ /*Waiting for our command in done_queue to be returned to OS.*/ ++ if (qla2x00_eh_wait_on_command(ha, cmd) != 0) { ++ DEBUG2(printk("qla2xxx_eh_abort: cmd returned back to OS.\n");) ++ return_status = SUCCESS; ++ } ++ ++ if (return_status == FAILED) { ++ printk(KERN_INFO "qla2xxx_eh_abort Exiting: status=Failed\n"); ++ return FAILED; ++ } ++ ++ DEBUG(printk("qla2xxx_eh_abort: Exiting. return_status=0x%x.\n", ++ return_status)); ++ ++ LEAVE("qla2xxx_eh_abort"); ++ ++ return(return_status); ++} ++ ++/************************************************************************** ++* qla2x00_eh_wait_for_pending_target_commands ++* ++* Description: ++* Waits for all the commands to come back from the specified target. ++* ++* Input: ++* ha - pointer to scsi_qla_host structure. ++* t - target ++* Returns: ++* Either SUCCESS or FAILED. ++* ++* Note: ++**************************************************************************/ ++int ++qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, int t) ++{ ++ int cnt; ++ int status; ++ unsigned long flags; ++ srb_t *sp; ++ Scsi_Cmnd *cmd; ++ ++ status = 0; ++ ++ /* ++ * Waiting for all commands for the designated target in the active ++ * array ++ */ ++ for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ cmd = sp->cmd; ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ if (SCSI_TCN_32(cmd) == t) { ++ qla2x00_eh_wait_on_command(ha, cmd); ++ } ++ } ++ else { ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ } ++ } ++ return (status); ++} ++ ++ ++/************************************************************************** ++* qla2xxx_eh_device_reset ++* ++* Description: ++* The device reset function will reset the target and abort any ++* executing commands. ++* ++* NOTE: The use of SP is undefined within this context. Do *NOT* ++* attempt to use this value, even if you determine it is ++* non-null. ++* ++* Input: ++* cmd = Linux SCSI command packet of the command that cause the ++* bus device reset. ++* ++* Returns: ++* SUCCESS/FAILURE (defined as macro in scsi.h). ++* ++**************************************************************************/ ++int ++qla2xxx_eh_device_reset(Scsi_Cmnd *cmd) ++{ ++ int return_status = SUCCESS; ++ uint32_t b, t, l; ++ scsi_qla_host_t *ha; ++ ++#if defined(LOGOUT_AFTER_DEVICE_RESET) ++ os_lun_t *lq; ++ fc_port_t *fcport; ++#endif ++ ++ ENTER(__func__); ++ ++ if (cmd == NULL) { ++ printk(KERN_INFO ++ "%s(): **** SCSI mid-layer passing in NULL cmd\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ /* Verify the device exists. */ ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ha->eh_start = 0; ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ if (TGT_Q(ha, t) == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL TGT_Q\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++#if STOP_ON_RESET ++ printk(debug_buff,"Resetting Device= 0x%x\n", (int)cmd); ++/* WE SHOULD NOT call this function, since it dereferences SP */ ++ //qla2x00_print_scsi_cmd(cmd); ++ qla2x00_panic(__func__, ha->host); ++#endif ++ ++ if (qla2x00_verbose) ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n", ++ ha->host_no, (int)b, (int)t, (int)l); ++ ++ DEBUG2(printk("scsi(%ld): DEVICE_RESET cmd=%p jiffies = 0x%lx, " ++ "timeout=%x, dpc_flags=%lx, status=%x allowed=%d " ++ "cmd.state=%x\n", ++ ha->host_no, ++ cmd, ++ jiffies, ++ CMD_TIMEOUT(cmd)/HZ, ++ ha->dpc_flags, ++ cmd->result, ++ cmd->allowed, ++ cmd->state);) ++/* WE SHOULD NOT call this function, since it dereferences SP */ ++ //qla2x00_print_scsi_cmd(cmd); ++ ++ if (!((test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ (test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) || ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN)|| ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ ha->loop_state != LOOP_READY)) { ++ ++ clear_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags); ++ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ if (qla2x00_device_reset(ha, t, l) != 0) { ++ return_status = FAILED; ++ } ++ ++#if defined(LOGOUT_AFTER_DEVICE_RESET) ++ if (return_status == SUCCESS) { ++ lq = (os_lun_t *)LUN_Q(ha, t, l); ++ fcport = lq->fclun->fcport; ++ ++ if (fcport->flags & FC_FABRIC_DEVICE) { ++ qla2x00_fabric_logout(ha, ++ ha->fc_db[t].loop_id & 0xff); ++ ha->fc_db[t].flag |= DEV_RELOGIN; ++ qla2x00_mark_device_lost(ha, fcport); ++ } ++ } ++#endif ++ ++ spin_lock_irq(ha->host->host_lock); ++ } else { ++ /* ++ * Wait a while for the loop to come back. Return SUCCESS ++ * for the kernel to try again. ++ */ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5 * HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ return_status = SUCCESS; ++ } ++ ++ if (return_status == FAILED) { ++ DEBUG2(printk("%s() Exiting: Reset Failed\n", __func__);) ++ return (FAILED); ++ } ++ ++ /* Waiting for all commands to complete for the device */ ++ if (qla2x00_eh_wait_for_pending_target_commands(ha, t)) ++ return_status = FAILED; ++ ++ if (return_status == FAILED) { ++ printk(KERN_INFO "%s() Exiting: status = Failed\n", __func__); ++ return (FAILED); ++ } ++ ++ LEAVE(__func__); ++ ++ return (return_status); ++} ++ ++/************************************************************************** ++* qla2x00_eh_wait_for_pending_commands ++* ++* Description: ++* Waits for all the commands to come back from the specified host. ++* ++* Input: ++* ha - pointer to scsi_qla_host structure. ++* ++* Returns: ++* 1 : SUCCESS ++* 0 : FAILED ++* ++* Note: ++**************************************************************************/ ++int ++qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha) ++{ ++ int cnt; ++ int status; ++ unsigned long flags; ++ srb_t *sp; ++ Scsi_Cmnd *cmd; ++ ++ status = 1; ++ ++ /* ++ * Waiting for all commands for the designated target in the active ++ * array ++ */ ++ for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ cmd = sp->cmd; ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ status = qla2x00_eh_wait_on_command(ha, cmd); ++ } ++ else { ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ } ++ } ++ return (status); ++} ++ ++ ++/************************************************************************** ++* qla2xxx_eh_bus_reset ++* ++* Description: ++* The bus reset function will reset the bus and abort any executing ++* commands. ++* ++* Input: ++* cmd = Linux SCSI command packet of the command that cause the ++* bus reset. ++* ++* Returns: ++* SUCCESS/FAILURE (defined as macro in scsi.h). ++* ++**************************************************************************/ ++int ++qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd) ++{ ++ int return_status = SUCCESS; ++ uint32_t b, t, l; ++ srb_t *sp; ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha, *search_ha; ++ ++ ++ ENTER("qla2xxx_eh_bus_reset"); ++ ++ if (cmd == NULL) { ++ printk(KERN_INFO ++ "%s(): **** SCSI mid-layer passing in NULL cmd\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ ha = (scsi_qla_host_t *) cmd->device->host->hostdata; ++ ha->eh_start=0; ++ sp = (srb_t *) CMD_SP(cmd); ++ ++ if (ha == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ search_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (search_ha == ha) { ++ found ++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (!found) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL search HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++#if STOP_ON_RESET ++ printk("Resetting the Bus= 0x%x\n", (int)cmd); ++ qla2x00_print_scsi_cmd(cmd); ++ qla2x00_panic("qla2100_reset", ha->host); ++#endif ++ ++ if (qla2x00_verbose) ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): LOOP RESET ISSUED.\n", ++ ha->host_no, (int)b, (int)t, (int)l); ++ ++ if (!((test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN)|| ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ ha->loop_state != LOOP_READY)) { ++ ++ clear_bit(LOOP_RESET_NEEDED, &ha->dpc_flags); ++ spin_unlock_irq(ha->host->host_lock); ++ ++ if (qla2x00_loop_reset(ha) != 0) { ++ return_status = FAILED; ++ } ++ spin_lock_irq(ha->host->host_lock); ++ } else { ++ /* ++ * Wait a while for the loop to come back. Return SUCCESS ++ * for the kernel to try again. ++ */ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5 * HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ return_status = SUCCESS; ++ } ++ ++ if (return_status == FAILED) { ++ DEBUG2(printk("qla2xxx_eh_bus_reset Exiting: Reset Failed\n");) ++ printk("qla2xxx_eh_bus_reset Exiting: Reset Failed\n"); ++ return FAILED; ++ } ++ ++ /* Blocking Call. It goes to sleep waiting for cmd to get to done q */ ++ /* Waiting for our command in done_queue to be returned to OS.*/ ++ ++ if ( qla2x00_eh_wait_for_pending_commands(ha) == 0) { ++ return_status = FAILED; ++ } ++ ++ if(return_status == FAILED) { ++ printk(KERN_INFO "qla2xxx_eh_bus_reset Exiting: status=Failed\n"); ++ return FAILED; ++ } else ++ printk(KERN_INFO "qla2xxx_eh_bus_reset Exiting: status=SUCCESS\n"); ++ ++ LEAVE("qla2xxx_eh_bus_reset"); ++ ++ return (return_status); ++} ++ ++/************************************************************************** ++* qla2xxx_eh_host_reset ++* ++* Description: ++* The reset function will reset the Adapter. ++* ++* Input: ++* cmd = Linux SCSI command packet of the command that cause the ++* adapter reset. ++* ++* Returns: ++* Either SUCCESS or FAILED. ++* ++* Note: ++**************************************************************************/ ++int ++qla2xxx_eh_host_reset(Scsi_Cmnd *cmd) ++{ ++ int return_status = SUCCESS; ++ srb_t *sp; ++ uint32_t b, t, l; ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha, *search_ha; ++ ++ ENTER("qla2xxx_eh_host_reset"); ++ ++ if (cmd == NULL) { ++ printk(KERN_INFO ++ "%s(): **** SCSI mid-layer passing in NULL cmd\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ha->eh_start= 0; ++ /* Find actual ha */ ++ sp = (srb_t *)CMD_SP(cmd); ++ if (ha->flags.failover_enabled && sp != NULL) ++ ha = sp->ha; ++ else ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++ if (ha == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ search_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (search_ha == ha) { ++ found ++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (!found) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL search HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ /* Display which one we're actually resetting for debug. */ ++ DEBUG(printk("qla2xxx_eh_host_reset: entered for scsi%ld. " ++ "Resetting host_no %ld.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ ha->host_no)); ++ ++#if STOP_ON_RESET ++ printk("Host Reset... Command=\n"); ++ qla2x00_print_scsi_cmd(cmd); ++ qla2x00_panic("qla2xxx_eh_host_reset", ha->host); ++#endif ++ ++ /* ++ * Now issue reset. ++ */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ if (qla2x00_verbose) { ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): now issue ADAPTER RESET.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ (int)b, ++ (int)t, ++ (int)l); ++ } ++ ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): now issue ADAPTER RESET.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ (int)b, (int)t, (int)l)); ++ ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { ++ set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ if (qla2x00_abort_isp(ha, 1)) { ++ /* failed. try later */ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return_status = FAILED; ++ ++ DEBUG2(printk(KERN_WARNING ++ "scsi(%ld:%d:%d:%d): ha %ld ADAPTER RESET " ++ "failed. Scheduled retry later.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ (int)b, (int)t, (int)l, ha->host_no);) ++ } else { ++ return_status = SUCCESS; ++ } ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ } else { ++ /* ++ * Already active. Sleep a while then return SUCCESS for kernel ++ * to retry the IO. ++ */ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5 * HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ return_status = SUCCESS; ++ } ++ if ( return_status == FAILED) { ++ DEBUG2(printk("qla2xxx_eh_host_reset Exiting: Reset Failed\n");) ++ return FAILED; ++ } ++ ++ /* Waiting for our command in done_queue to be returned to OS.*/ ++ if ( qla2x00_eh_wait_for_pending_commands(ha) == 0) { ++ return_status = FAILED; ++ } ++ ++ if(return_status == FAILED) { ++ printk(KERN_INFO "qla2xxx_eh_host_reset Exiting: status=Failed\n"); ++ return FAILED; ++ } else ++ printk(KERN_INFO "qla2xxx_eh_host_reset Exiting: status=SUCCESS\n"); ++ ++ LEAVE("qla2xxx_eh_host_reset"); ++ ++ return(return_status); ++} ++ ++ ++/* ++* qla2x00_loop_reset ++* Issue loop reset. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++static uint8_t ++qla2x00_loop_reset(scsi_qla_host_t *ha) ++{ ++ uint8_t status = QL_STATUS_SUCCESS; ++ uint16_t t; ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ if (ha->flags.enable_lip_reset) { ++ status = qla2x00_lip_reset(ha); ++ } ++ ++ if (status == QL_STATUS_SUCCESS && ha->flags.enable_target_reset) { ++ for (t = 0; t < MAX_FIBRE_DEVICES; t++) { ++ if ((tq = TGT_Q(ha, t)) == NULL) ++ continue; ++ ++ if (tq->vis_port == NULL) ++ continue; ++ ++ status = qla2x00_target_reset(ha, 0, t); ++ if (status != QL_STATUS_SUCCESS) { ++ break; ++ } ++ } ++ } ++ ++ if (status == QL_STATUS_SUCCESS && ++ ((!ha->flags.enable_target_reset && ++ !ha->flags.enable_lip_reset) || ++ ha->flags.enable_lip_full_login)) { ++ ++ status = qla2x00_full_login_lip(ha); ++ } ++ ++ /* Issue marker command only when we are going to start the I/O */ ++ ha->marker_needed = 1; ++ ++ if (status) { ++ /* Empty */ ++ DEBUG2_3(printk("%s(%ld): **** FAILED ****\n", ++ __func__, ++ ha->host_no);) ++ } else { ++ /* Empty */ ++ DEBUG3(printk("%s(%ld): exiting normally.\n", ++ __func__, ++ ha->host_no);) ++ } ++ ++ LEAVE(__func__); ++ ++ return(status); ++} ++ ++/* ++ * qla2x00_device_reset ++ * Issue bus device reset message to the target. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI ID. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_device_reset(scsi_qla_host_t *vis_ha, uint16_t tgt, uint16_t lun) ++{ ++#if !USE_ABORT_TGT ++ uint16_t l; ++ fc_port_t *fcport; ++#endif ++ os_lun_t *lq; ++ uint8_t status = 0; ++ ++ ENTER(__func__); ++ ++#if USE_ABORT_TGT ++ /* Abort Target command will clear Reservation */ ++ lq = GET_LU_Q(vis_ha, tgt, lun); ++ if (lq && lq->fclun) ++ status = qla2x00_abort_target(lq->fclun->fcport); ++#else ++ /* Abort Device command will not clear Reservation */ ++ for (l = 0; l < MAX_LUNS; l++) { ++ lq = GET_LU_Q(vis_ha, tgt, l); ++ if (lq == NULL) ++ continue; ++ ++ fcport = lq->fclun->fcport; ++ if (LOOP_RDY(fcport->ha)) { ++ qla2x00_abort_device(fcport->ha, ++ fcport->loop_id, ++ lq->fclun->lun); ++ } ++ } ++#endif ++ ++ LEAVE(__func__); ++ ++ return( status ); ++} ++ ++/************************************************************************** ++* qla1200_biosparam ++* ++* Description: ++* Return the disk geometry for the given SCSI device. ++**************************************************************************/ ++int ++qla2x00_biosparam(struct scsi_device *sdev, ++ struct block_device *bdev, sector_t capacity, int geom[]) ++{ ++ int heads, sectors, cylinders; ++ ++ heads = 64; ++ sectors = 32; ++ cylinders = (unsigned long)capacity / (heads * sectors); ++ if (cylinders > 1024) { ++ heads = 255; ++ sectors = 63; ++ cylinders = (unsigned long)capacity / (heads * sectors); ++ } ++ ++ geom[0] = heads; ++ geom[1] = sectors; ++ geom[2] = cylinders; ++ ++ return (0); ++} ++ ++/************************************************************************** ++ * qla2x00_slave_configure ++ * Determines the queue depth for a given device. There are two ways ++ * a queue depth can be obtained for a tagged queueing device. One ++ * way is the default queue depth which is determined by whether ++ * If it is defined, then it is used ++ * as the default queue depth. Otherwise, we use either 4 or 8 as the ++ * default queue depth (dependent on the number of hardware SCBs). ++ **************************************************************************/ ++int ++qla2xxx_slave_configure(Scsi_Device * device) ++{ ++ int queue_depth = 64; ++ ++ if (device->tagged_supported) { ++#if defined(MODULE) ++ if (!(ql2xmaxqdepth == 0 || ql2xmaxqdepth > 256)) ++ queue_depth = ql2xmaxqdepth; ++#endif ++ ql2xmaxqdepth = queue_depth; ++ ++ scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, queue_depth); ++ ++ printk(KERN_INFO ++ "scsi(%d:%d:%d:%d): Enabled tagged queuing, queue " ++ "depth %d.\n", ++ device->host->host_no, ++ device->channel, device->id, device->lun, ++ device->queue_depth); ++ } else { ++ scsi_adjust_queue_depth(device, 0 /* TCQ off */, ++ device->host->hostt->cmd_per_lun /* 3 */); ++ } ++ ++ return (0); ++} ++ ++/* ++ * PCI driver interface ++ */ ++static int __devinit ++qla_probe_device(struct pci_dev *pdev, const struct pci_device_id *ent) ++{ ++ device_reg_t *reg; ++ struct Scsi_Host *host; ++ scsi_qla_host_t *ha; ++ unsigned long flags = 0; ++ unsigned long wait_switch = 0; ++ ++ if (pci_enable_device(pdev)) ++ return -1; ++ ++ printk(KERN_INFO ++ "qla2x00: Found VID=%x DID=%x SSVID=%x SSDID=%x\n", ++ pdev->vendor, pdev->device, ++ pdev->subsystem_vendor, pdev->subsystem_device); ++ ++ if (ql2xfailover) { ++ sprintf(qla2x00_version_str, "%s-fo", QLA2100_VERSION); ++ } else { ++ sprintf(qla2x00_version_str, "%s", QLA2100_VERSION); ++ } ++ ++ host = scsi_register(&qla2x00_driver_template, sizeof(scsi_qla_host_t)); ++ if (host == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: Couldn't register with scsi layer!\n"); ++ return -1; ++ } ++ ++ /* Clear our data area */ ++ ha = (scsi_qla_host_t *)host->hostdata; ++ memset(ha, 0, sizeof(scsi_qla_host_t)); ++ ++ ha->host_no = host->host_no; ++ ha->host = host; ++ ++ /* Sanitize the information from PCI BIOS. */ ++ host->irq = pdev->irq; ++ host->io_port = pci_resource_start(pdev, 0); ++ ha->pdev = pdev; ++ scsi_set_device(host, &pdev->dev); ++ ++ ha->brd_info = (struct qla_board_info *)ent->driver_data; ++ ++ if (qla2x00_verbose) { ++ printk(KERN_INFO ++ "scsi(%d): Found a %s @ bus %d, device 0x%x, irq %d, " ++ "iobase 0x%lx\n", ++ host->host_no, ++ ha->brd_info->name, ++ ha->pdev->bus->number, ++ PCI_SLOT(ha->pdev->devfn), ++ host->irq, host->io_port); ++ } ++ ++ ha->iobase = (device_reg_t *) host->io_port; ++ ++ spin_lock_init(&ha->hardware_lock); ++ ++ /* 4.23 Initialize /proc/scsi/qla2x00 counters */ ++ ha->actthreads = 0; ++ ha->qthreads = 0; ++ ha->dump_done = 0; ++ ha->total_isr_cnt = 0; ++ ha->total_isp_aborts = 0; ++ ha->total_lip_cnt = 0; ++ ha->total_dev_errs = 0; ++ ha->total_ios = 0; ++ ha->total_bytes = 0; ++ ++ if (qla2x00_mem_alloc(ha)) { ++ printk(KERN_WARNING ++ "scsi(%d): [ERROR] Failed to allocate memory for adapter\n", ++ host->host_no); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ ++ ha->prev_topology = 0; ++ ha->ports = MAX_BUSES; ++ ++#if defined(ISP2100) ++ ha->max_targets = MAX_TARGETS_2100; ++#else ++ ha->max_targets = MAX_TARGETS_2200; ++#endif ++ ++ /* load the F/W, read paramaters, and init the H/W */ ++ ha->instance = num_hosts; ++ ++ init_MUTEX_LOCKED(&ha->mbx_intr_sem); ++ ++ INIT_LIST_HEAD(&ha->list); ++ INIT_LIST_HEAD(&ha->fcports); ++ INIT_LIST_HEAD(&ha->fcinitiators); ++ INIT_LIST_HEAD(&ha->done_queue); ++ INIT_LIST_HEAD(&ha->retry_queue); ++ INIT_LIST_HEAD(&ha->scsi_retry_queue); ++ INIT_LIST_HEAD(&ha->failover_queue); ++ INIT_LIST_HEAD(&ha->pending_queue); ++ ++ if (ql2xfailover) ++ ha->flags.failover_enabled = 1; ++ else ++ ha->flags.failover_enabled = 0; ++ ++ INIT_WORK(&ha->run_qla_task, qla2x00_done_work, (void *) ha); ++ ++ /* ++ * These locks are used to prevent more than one CPU ++ * from modifying the queue at the same time. The ++ * higher level "io_request_lock" will reduce most ++ * contention for these locks. ++ */ ++ spin_lock_init(&ha->mbx_bits_lock); ++ spin_lock_init(&ha->mbx_reg_lock); ++ spin_lock_init(&ha->mbx_q_lock); ++ spin_lock_init(&ha->list_lock); ++ ++ if (qla2x00_initialize_adapter(ha) && ++ !(ha->device_flags & DFLG_NO_CABLE)) { ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to initialize adapter\n", ha->host_no); ++ ++ DEBUG2(printk("scsi(%ld): Failed to initialize adapter - " ++ "Adapter flags %x.\n", ++ ha->host_no, ha->device_flags)); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ ++ /* ++ * Startup the kernel thread for this host adapter ++ */ ++ init_completion(&ha->dpc_inited); ++ init_completion(&ha->dpc_exited); ++ ++ ha->dpc_should_die = 0; ++ ha->dpc_pid = kernel_thread(qla2x00_do_dpc, ha, 0); ++ if (ha->dpc_pid < 0) { ++ printk(KERN_WARNING ++ "scsi(%ld): Unable to start DPC thread!\n", ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ wait_for_completion(&ha->dpc_inited); ++ ++ /* Mark preallocated Loop IDs in use. */ ++ ha->fabricid[SNS_FL_PORT].in_use = TRUE; ++ ha->fabricid[FABRIC_CONTROLLER].in_use = TRUE; ++ ha->fabricid[SIMPLE_NAME_SERVER].in_use = TRUE; ++ ++ /* Register our resources with Linux */ ++ if (qla2x00_register_with_Linux(ha, ha->ports - 1)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to register resources.\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ ++ DEBUG2(printk("DEBUG: detect hba %ld at address = %p\n", ++ ha->host_no, ha)); ++ ++ reg = ha->iobase; ++ ++ /* Disable ISP interrupts. */ ++ qla2x00_disable_intrs(ha); ++ ++ /* Ensure mailbox registers are free. */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_HOST_INT); ++ ++ /* Enable proper parity */ ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) ++ /* SRAM, Instruction RAM and GP RAM parity */ ++ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x7)); ++ else ++ /* SRAM parity */ ++ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x1)); ++#endif ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ /* ++ * if failover is enabled read the user configuration ++ */ ++ if (ha->flags.failover_enabled) { ++ if (ConfigRequired > 0) ++ mp_config_required = 1; ++ else ++ mp_config_required = 0; ++ ++ DEBUG(printk("qla2x00_detect: qla2x00_cfg_init for hba %ld\n", ++ ha->instance)); ++ ++ qla2x00_cfg_init(ha); ++ } ++ ++ /* Enable chip interrupts. */ ++ qla2x00_enable_intrs(ha); ++ ++ /* Insert new entry into the list of adapters */ ++ write_lock(&qla_hostlist_lock); ++ list_add_tail(&ha->list, &qla_hostlist); ++ write_unlock(&qla_hostlist_lock); ++ ++ /* v2.19.5b6 */ ++ /* ++ * Wait around max loop_reset_delay secs for the devices to come ++ * on-line. We don't want Linux scanning before we are ready. ++ * ++ */ ++ for (wait_switch = jiffies + (ha->loop_reset_delay * HZ); ++ time_before(jiffies,wait_switch) && ++ !(ha->device_flags & (DFLG_NO_CABLE | DFLG_FABRIC_DEVICES)) ++ && (ha->device_flags & SWITCH_FOUND) ;) { ++ ++ qla2x00_check_fabric_devices(ha); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5); ++ } ++ ++ /* List the target we have found */ ++ if (displayConfig && (!ha->flags.failover_enabled)) ++ qla2x00_display_fc_names(ha); ++ ++ pci_set_drvdata(pdev, ha); ++ ha->init_done = 1; ++ num_hosts++; ++ ++ if (displayConfig && ha->flags.failover_enabled) ++ qla2x00_cfg_display_devices(); ++ ++ return 0; ++} ++ ++static void __devexit ++qla_remove_device(struct pci_dev *pdev) ++{ ++ struct list_head *hal, *temp; ++ scsi_qla_host_t *ha, *iter_ha; ++ ++ ha = pci_get_drvdata(pdev); ++ ++ /* Sanity check -- make sure the entry is in our list */ ++ write_lock(&qla_hostlist_lock); ++ list_for_each_safe(hal, temp, &qla_hostlist) { ++ iter_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (iter_ha == ha) { ++ list_del(&ha->list); ++ qla2x00_free_device(ha); ++ break; ++ } ++ } ++ write_unlock(&qla_hostlist_lock); ++} ++ ++static void ++qla2x00_free_device(scsi_qla_host_t *ha) ++{ ++ int ret; ++ struct Scsi_Host *host; ++ ++ host = ha->host; ++ ++ /* turn-off interrupts on the card */ ++ if (ha->interrupts_on) ++ qla2x00_disable_intrs(ha); ++ ++ /* Detach interrupts */ ++ if (host->irq) ++ free_irq(host->irq, ha); ++ ++ /* release io space registers */ ++ if (host->io_port) ++ release_region(host->io_port, 0xff); ++ ++ /* Disable timer */ ++ if (ha->timer_active) ++ qla2x00_stop_timer(ha); ++ ++ /* Kill the kernel thread for this host */ ++ if (ha->dpc_pid >= 0) { ++ ha->dpc_should_die = 1; ++ wmb(); ++ ret = kill_proc(ha->dpc_pid, SIGTERM, 1); ++ if (ret) { ++ printk(KERN_ERR ++ "scsi(%ld): Unable to signal DPC thread -- (%d)\n", ++ ha->host_no, ret); ++ ++ /* TODO: SOMETHING MORE??? */ ++ } else { ++ wait_for_completion(&ha->dpc_exited); ++ } ++ } ++ ++#if MEMORY_MAPPED_IO ++ if (ha->mmpbase) { ++ iounmap((void *) (((unsigned long) ha->mmpbase) & PAGE_MASK)); ++ } ++#endif ++ ++ apidev_cleanup(); ++ ++ qla2x00_mem_free(ha); ++ ++ if (ha->flags.failover_enabled) ++ qla2x00_cfg_mem_free(ha); ++ ++ ha->flags.online = FALSE; ++ ++ scsi_unregister(host); ++} ++ ++ ++/* ++ * The following support functions are adopted to handle ++ * the re-entrant qla2x00_proc_info correctly. ++ */ ++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); ++} ++ ++/************************************************************************* ++* qla2x00_proc_info ++* ++* Description: ++* Return information to handle /proc support for the driver. ++* ++* inout : decides the direction of the dataflow and the meaning of the ++* variables ++* buffer: If inout==FALSE data is being written to it else read from it ++* (ptr to a page buffer) ++* *start: If inout==FALSE start of the valid data in the buffer ++* offset: If inout==FALSE starting offset from the beginning of all ++* possible data to return. ++* length: If inout==FALSE max number of bytes to be written into the buffer ++* else number of bytes in "buffer" ++* Returns: ++* < 0: error. errno value. ++* >= 0: sizeof data returned. ++*************************************************************************/ ++int ++qla2x00_proc_info(char *buffer, ++ char **start, off_t offset, int length, int hostno, int inout) ++{ ++ struct Scsi_Host *host; ++ struct info_str info; ++ int i; ++ int retval = -EINVAL; ++ os_lun_t *up; ++ uint32_t t, l; ++ uint32_t tmp_sn; ++ unsigned long *flags; ++ struct list_head *list, *temp; ++ unsigned long cpu_flags; ++ uint8_t *loop_state; ++#if REQ_TRACE ++ Scsi_Cmnd *cp; ++ srb_t *sp; ++#endif ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ DEBUG3(printk(KERN_INFO ++ "Entering proc_info buff_in=%p, offset=0x%lx, length=0x%x, " ++ "hostno=%d\n", buffer, offset, length, hostno);) ++ ++ ha = NULL; ++ host = NULL; ++ ++ /* Find the host that was specified */ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (ha->host->host_no == hostno) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ /* if host wasn't found then exit */ ++ if (!found) { ++ DEBUG2_3(printk(KERN_WARNING ++ "%s: Can't find adapter for host number %d\n", ++ __func__, hostno);) ++ ++ return (retval); ++ } ++ ++ host = ha->host; ++ ++ if (inout == TRUE) { ++ /* Has data been written to the file? */ ++ DEBUG3(printk( ++ "%s: has data been written to the file. \n", ++ __func__);) ++ return (qla2x00_set_info(buffer, length, host)); ++ } ++ ++ if (start) { ++ *start = buffer; ++ } ++ ++ info.buffer = buffer; ++ info.length = length; ++ info.offset = offset; ++ info.pos = 0; ++ ++ /* start building the print buffer */ ++ copy_info(&info, ++ "QLogic PCI to Fibre Channel Host Adapter for " ISP_NAME ":\n" ++ " Firmware version: %2d.%02d.%02d ", ++ ha->fw_major_version, ++ ha->fw_minor_version, ++ ha->fw_subminor_version); ++ ++ switch (ha->fw_attributes & 0xFF) { ++ case 0x7: ++ copy_info(&info, "EF"); ++ break; ++ case 0x17: ++ copy_info(&info, "TP"); ++ break; ++ case 0x37: ++ copy_info(&info, "IP"); ++ break; ++ case 0x77: ++ copy_info(&info, "VI"); ++ break; ++ default: ++ copy_info(&info, "(%x)", ha->fw_attributes); ++ break; ++ } ++ if (ha->fw_attributes & 0x100) ++ copy_info(&info, "X"); ++ copy_info(&info, ", "); ++ ++ copy_info(&info, "Driver version %s\n", qla2x00_version_str); ++ ++ copy_info(&info, "Entry address = %p\n", qla2x00_set_info); ++ ++ tmp_sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ++ ha->serial1; ++ copy_info(&info, "HBA: %s, Serial# %c%05d\n", ++ ha->brd_info->name, ('A' + tmp_sn/100000), (tmp_sn%100000)); ++ ++ copy_info(&info, ++ "Request Queue = 0x%lx, Response Queue = 0x%lx\n", ++ (long unsigned int)ha->request_dma, ++ (long unsigned int)ha->response_dma); ++ ++ copy_info(&info, ++ "Request Queue count= %ld, Response Queue count= %ld\n", ++ (long)REQUEST_ENTRY_CNT, (long)RESPONSE_ENTRY_CNT); ++ ++ copy_info(&info, ++ "Total number of active commands = %ld\n", ++ ha->actthreads); ++ ++ copy_info(&info, ++ "Total number of interrupts = %ld\n", ++ (long)ha->total_isr_cnt); ++ ++#if defined(FC_IP_SUPPORT) ++ copy_info(&info, ++ "Total number of active IP commands = %ld\n", ++ ha->ipreq_cnt); ++#endif ++ ++#if defined(IOCB_THROLLE_USAGE) ++#if defined(IOCB_HIT_RATE) ++ copy_info(&info, ++ "Total number of IOCBs (used/max/#hit) " ++ "= (%d/%d/%d)\n", ++ (int)ha->iocb_cnt, ++ (int)ha->iocb_hiwat, ++ (int)ha->iocb_overflow_cnt); ++#else ++ copy_info(&info, ++ "Total number of IOCBs (used/max) " ++ "= (%d/%d)\n", ++ (int)ha->iocb_cnt, (int)ha->iocb_hiwat); ++#endif ++#endif ++ ++ ++ copy_info(&info, ++ "Total number of queued commands = %d\n", ++ (max_srbs - ha->srb_cnt)); ++ ++ copy_info(&info, ++ " Device queue depth = 0x%x\n", ++ (ql2xmaxqdepth == 0) ? 16 : ql2xmaxqdepth); ++ ++ copy_info(&info, ++ "Number of free request entries = %d\n", ha->req_q_cnt); ++ ++ copy_info(&info, ++ "Number of mailbox timeouts = %ld\n", ++ qla2x00_stats.mboxtout); ++ ++ copy_info(&info, ++ "Number of ISP aborts = %ld\n",qla2x00_stats.ispAbort); ++ ++ copy_info(&info, ++ "Number of loop resyncs = %ld\n", ++ qla2x00_stats.loop_resync); ++ ++ copy_info(&info, ++ "Number of retries for empty slots = %ld\n", ++ qla2x00_stats.outarray_full); ++ ++ copy_info(&info, ++ "Number of reqs in pending_q= %ld, retry_q= %d, " ++ "done_q= %ld, scsi_retry_q= %d\n", ++ ha->qthreads, ha->retry_q_cnt, ++ ha->done_q_cnt, ha->scsi_retry_q_cnt); ++ ++ if (ha->flags.failover_enabled) { ++ copy_info(&info, ++ "Number of reqs in failover_q= %d\n", ++ ha->failover_cnt); ++ } ++ ++ flags = (unsigned long *) &ha->flags; ++ ++ if (ha->loop_state == LOOP_DOWN) { ++ loop_state = "DOWN"; ++ } else if (ha->loop_state ==LOOP_UP) { ++ loop_state = "UP"; ++ } else if (ha->loop_state ==LOOP_READY) { ++ loop_state = "READY"; ++ } else if (ha->loop_state ==LOOP_TIMEOUT) { ++ loop_state = "TIMEOUT"; ++ } else if (ha->loop_state ==LOOP_UPDATE) { ++ loop_state = "UPDATE"; ++ } else { ++ loop_state = "UNKNOWN"; ++ } ++ ++ copy_info(&info, ++ "Host adapter:loop state= <%s>, flags= 0x%lx\n", ++ loop_state , *flags); ++ ++ copy_info(&info, "Dpc flags = 0x%lx\n", ha->dpc_flags); ++ ++ copy_info(&info, "MBX flags = 0x%x\n", ha->mbx_flags); ++ ++ copy_info(&info, "SRB Free Count = %d\n", ha->srb_cnt); ++ ++ copy_info(&info, "Port down retry = %3.3d\n", ++ ha->port_down_retry_count); ++ ++ copy_info(&info, "Login retry count = %3.3d\n", ++ ha->login_retry_count); ++ ++ copy_info(&info, ++ "Commands retried with dropped frame(s) = %d\n", ++ ha->dropped_frame_error_cnt); ++ ++ copy_info(&info, "\n"); ++ ++#if REQ_TRACE ++ if (qla2x00_req_dmp) { ++ copy_info(&info, ++ "Outstanding Commands on controller:\n"); ++ ++ for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ if ((sp = ha->outstanding_cmds[i]) == NULL) { ++ continue; ++ } ++ ++ if ((cp = sp->cmd) == NULL) { ++ continue; ++ } ++ ++ copy_info(&info, "(%d): Pid=%d, sp flags=0x%lx" ++ ", cmd=0x%p, state=%d\n", ++ i, ++ (int)sp->cmd->serial_number, ++ (long)sp->flags, ++ CMD_SP(sp->cmd), ++ (int)sp->state); ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ goto profile_stop; ++ } ++ } ++ } ++#endif /* REQ_TRACE */ ++ ++ if (qla2x00_retryq_dmp) { ++ if (!list_empty(&ha->retry_queue)) { ++ copy_info(&info, ++ "qla%ld: Retry queue requests:\n", ++ ha->host_no); ++ ++ spin_lock_irqsave(&ha->list_lock, cpu_flags); ++ ++ i = 0; ++ list_for_each_safe(list, temp, &ha->retry_queue) { ++ sp = list_entry(list, srb_t, list); ++ t = SCSI_TCN_32(sp->cmd); ++ l = SCSI_LUN_32(sp->cmd); ++ ++ copy_info(&info, ++ "%d: target=%d, lun=%d, " ++ "pid=%ld sp=%p, sp->flags=0x%x," ++ "sp->state= %d\n", ++ i, t, l, ++ sp->cmd->serial_number, sp, ++ sp->flags, sp->state ); ++ ++ i++; ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ goto profile_stop; ++ } ++ } ++ ++ spin_unlock_irqrestore(&ha->list_lock, cpu_flags); ++ ++ } /* if (!list_empty(&ha->retry_queue))*/ ++ } /* if ( qla2x00_retryq_dmp ) */ ++ ++ /* 2.25 node/port display to proc */ ++ /* Display the node name for adapter */ ++ copy_info(&info, "\nSCSI Device Information:\n"); ++ copy_info(&info, ++ "scsi-qla%d-adapter-node=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, ++ ha->init_cb->node_name[0], ++ ha->init_cb->node_name[1], ++ ha->init_cb->node_name[2], ++ ha->init_cb->node_name[3], ++ ha->init_cb->node_name[4], ++ ha->init_cb->node_name[5], ++ ha->init_cb->node_name[6], ++ ha->init_cb->node_name[7]); ++ ++ /* display the port name for adapter */ ++ copy_info(&info, ++ "scsi-qla%d-adapter-port=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, ++ ha->init_cb->port_name[0], ++ ha->init_cb->port_name[1], ++ ha->init_cb->port_name[2], ++ ha->init_cb->port_name[3], ++ ha->init_cb->port_name[4], ++ ha->init_cb->port_name[5], ++ ha->init_cb->port_name[6], ++ ha->init_cb->port_name[7]); ++ ++ /* Print out device port names */ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ if (ha->fc_db[i].loop_id == PORT_UNUSED) { ++ continue; ++ } ++ ++ if (ha->flags.failover_enabled) { ++ copy_info(&info, ++ "scsi-qla%d-port-%d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x:" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, i, ++ ha->fc_db[i].name[0], ++ ha->fc_db[i].name[1], ++ ha->fc_db[i].name[2], ++ ha->fc_db[i].name[3], ++ ha->fc_db[i].name[4], ++ ha->fc_db[i].name[5], ++ ha->fc_db[i].name[6], ++ ha->fc_db[i].name[7], ++ ha->fc_db[i].wwn[0], ++ ha->fc_db[i].wwn[1], ++ ha->fc_db[i].wwn[2], ++ ha->fc_db[i].wwn[3], ++ ha->fc_db[i].wwn[4], ++ ha->fc_db[i].wwn[5], ++ ha->fc_db[i].wwn[6], ++ ha->fc_db[i].wwn[7]); ++ } else { ++ copy_info(&info, ++ "scsi-qla%d-target-%d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, i, ++ ha->fc_db[i].wwn[0], ++ ha->fc_db[i].wwn[1], ++ ha->fc_db[i].wwn[2], ++ ha->fc_db[i].wwn[3], ++ ha->fc_db[i].wwn[4], ++ ha->fc_db[i].wwn[5], ++ ha->fc_db[i].wwn[6], ++ ha->fc_db[i].wwn[7]); ++ } ++ ++ } /* 2.25 node/port display to proc */ ++ ++ copy_info(&info, "\nSCSI LUN Information:\n"); ++ ++ copy_info(&info, "(Id:Lun)\n"); ++ ++ /* scan for all equipment stats */ ++ for (t = 0; t < MAX_FIBRE_DEVICES; t++) { ++ /* scan all luns */ ++ for (l = 0; l < ha->max_luns; l++) { ++ up = (os_lun_t *) GET_LU_Q(ha, t, l); ++ ++ if (up == NULL) { ++ continue; ++ } ++ if (up->fclun == NULL) { ++ continue; ++ } ++ if (up->fclun->flags & FC_DISCON_LUN) { ++ continue; ++ } ++ ++ copy_info(&info, ++ "(%2d:%2d): Total reqs %ld,", ++ t,l,up->io_cnt); ++ ++ copy_info(&info, ++ " Pending reqs %ld,", ++ up->out_cnt); ++ ++ if (up->io_cnt < 3) { ++ copy_info(&info, ++ " flags 0x%x*,", ++ (int)up->q_flag); ++ } else { ++ copy_info(&info, ++ " flags 0x%x,", ++ (int)up->q_flag); ++ } ++ ++ copy_info(&info, ++ " %ld:%d:%02x,", ++ up->fclun->fcport->ha->instance, ++ up->fclun->fcport->cur_path, ++ up->fclun->fcport->loop_id); ++ ++ copy_info(&info, "\n"); ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ goto profile_stop; ++ } ++ } ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ break; ++ } ++ } ++ ++profile_stop: ++ ++ retval = info.pos > info.offset ? info.pos - info.offset : 0; ++ ++ DEBUG3(printk(KERN_INFO ++ "Exiting proc_info: info.pos=%d, offset=0x%lx, " ++ "length=0x%x\n", info.pos, offset, length);) ++ ++#if QLA2100_LIPTEST ++ qla2x00_lip = 1; ++#endif ++ ++ return (retval); ++} ++ ++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) ++union wwnmap { ++ unsigned long long wwn; ++ unsigned char wwn_u8[8]; ++}; ++ ++int qla2x00_get_scsi_info_from_wwn (int mode, ++ unsigned long long wwn, ++ int *host, ++ int *channel, ++ int *lun, ++ int *id) { ++ ++scsi_qla_host_t *list; ++Scsi_Device *scsi_device; ++union wwnmap wwncompare; ++union wwnmap wwncompare2; ++int i, j, k; ++ ++ /* ++ * Retrieve big endian version of world wide name ++ */ ++ wwncompare2.wwn = wwn; ++ for (j = 0, k=7; j < 8; j++, k--) { ++ wwncompare.wwn_u8[j] = wwncompare2.wwn_u8[k]; ++ } ++ ++ /* ++ * query all hosts searching for WWN ++ */ ++ for (list = qla2x00_hostlist; list; list = list->next) { ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* ++ * Scan all devices in FibreChannel database ++ * if WWN match found, return SCSI device information ++ */ ++ if (memcmp (wwncompare.wwn_u8, list->fc_db[i].name, 8) == 0) { ++ /* ++ * If inserting, avoid scan for channel and lun information ++ */ ++ if (mode == 0) { ++ *channel = 0; ++ *lun = 0; ++ *host = list->host->host_no; ++ *id = i; ++ return (0); ++ } ++ ++ ++ /* ++ * WWN matches, find channel and lun information from scsi ++ * device ++ */ ++ for (scsi_device = list->host->host_queue; scsi_device; scsi_device = scsi_device->next) { ++ if (scsi_device->id == i) { ++ *channel = scsi_device->channel; ++ *lun = scsi_device->lun; ++ break; ++ } ++ } ++ if (scsi_device == 0) { ++ return (-ENOENT); ++ } ++ /* ++ * Device found, return all data ++ */ ++ *host = list->host->host_no; ++ *id = i; ++ return (0); ++ } /* memcmp */ ++ } /* i < MAXFIBREDEVICES */ ++ } ++ return (-ENOENT); ++} ++ ++int qla2x00_get_wwn_from_scsi_info (int host, int id, unsigned long long *wwn) { ++scsi_qla_host_t *list; ++union wwnmap wwnendian; ++union wwnmap wwnendian2; ++int j, k; ++ ++ /* ++ * Examine all QLogic hosts ++ */ ++ for (list = qla2x00_hostlist; list; list = list->next) { ++ if (host == list->host->host_no) { ++ /* ++ * Get endian corrected 64 bit WWN ++ */ ++ ++ memcpy (&wwnendian2.wwn, list->fc_db[id].name, 8); ++ for (j = 0, k=7; j < 8; j++, k--) { ++ wwnendian.wwn_u8[j] = wwnendian2.wwn_u8[k]; ++ } ++ *wwn = wwnendian.wwn; ++ return (0); ++ } ++ } ++ return (-ENOENT); ++} ++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ ++ ++/************************************************************************** ++* qla2x00_setup ++* ++* Handle Linux boot parameters. This routine allows for assigning a value ++* to a parameter with a ';' between the parameter and the value. ++* ie. qla2x00=arg0;arg1;...;argN;<properties .... properties> OR ++* via the command line. ++* ie. qla2x00 ql2xopts=arg0;arg1;...;argN;<properties .... properties> ++**************************************************************************/ ++#if !defined(MODULE) ++static int __init ++qla2x00_setup(char *s) ++#else ++void ++qla2x00_setup(char *s) ++#endif ++{ ++ char *cp, *np; ++ char *slots[MAXARGS]; ++ char **argv = &slots[0]; ++ static char buf[LINESIZE]; ++ int argc, opts; ++ ++#if !defined(MODULE) ++ if (s == NULL || *s == '\0') ++ return 0; ++#endif ++ ++ /* ++ * Determine if we have any properties. ++ */ ++ cp = s; ++ opts = 1; ++ while (*cp && (np = qla2x00_get_line(cp, buf)) != NULL) { ++ if (strncmp("scsi-qla",buf,8) == 0) { ++ DEBUG(printk("qla2100: devconf=%s\n",cp);) ++ ++ ql2xdevconf = cp; ++ (opts > 0)? opts-- : 0; ++ break; ++ } ++ opts++; ++ cp = np; ++ } ++ ++ /* ++ * Parse the args before the properties ++ */ ++ if (opts) { ++ opts = (opts > MAXARGS-1)? MAXARGS-1: opts; ++ argc = qla2x00_get_tokens(s, argv, opts); ++ while (argc > 0) { ++ cp = *argv; ++ DEBUG(printk("scsi: found cmd arg =[%s]\n", cp)); ++ ++ if (strcmp(cp, "verbose") == 0) { ++ DEBUG(printk("qla2100: verbose\n")); ++ qla2x00_verbose++; ++ } else if (strcmp(cp, "quiet") == 0) { ++ qla2x00_quiet = 1; ++ } else if (strcmp(cp, "reinit_on_loopdown") == 0) { ++ qla2x00_reinit++; ++ DEBUG(printk("qla2100: reinit_on_loopdown\n")); ++ } ++ argc--, argv++; ++ } ++ } ++ ++#if !defined(MODULE) ++ if (ql2xdevconf) ++ return 1; ++ else ++ return 0; ++#endif ++} ++ ++#if !defined(MODULE) ++__setup("ql2xopts=", qla2x00_setup); ++#endif ++ ++/********************** qla2x00_get_line ********************* ++* qla2x00_get_line ++* Copy a substring from the specified string. The substring ++* consists of any number of chars seperated by white spaces (i.e. spaces) ++* and ending with a newline '\n' or a semicolon ';'. ++* ++* Enter: ++* str - orig string ++* line - substring ++* ++* Returns: ++* cp - pointer to next string ++* or ++* null - End of string ++*************************************************************/ ++static char * ++qla2x00_get_line(char *str, char *line) ++{ ++ register char *cp = str; ++ register char *sp = line; ++ ++ /* skip preceeding spaces */ ++ while (*cp && *cp == ' ') ++ ++cp; ++ while ((*cp) && *cp != '\n' && *cp != ';') /* end of line */ ++ *sp++ = *cp++; ++ ++ *sp = '\0'; ++ ++ DEBUG5(printk("%s(): %s\n", __func__, line)); ++ ++ if( (*cp) ) { ++ cp++; ++ return (cp); ++ } ++ ++ return (NULL); ++} ++ ++ ++/**************************** get_tokens ********************* ++* Parse command line into argv1, argv2, ... argvX ++* Arguments are seperated by white spaces and colons and end ++* with a NULL. ++*************************************************************/ ++static int ++qla2x00_get_tokens(char *line, char **argv, int maxargs) ++{ ++ register char *cp = line; ++ int count = 0; ++ ++ while (*cp && count < maxargs) { ++ /* skip preceeding spaces */ ++ while ((*cp) && *cp == ' ') ++ ++cp; ++ /* symbol starts here */ ++ argv[count++] = cp; ++ /* skip symbols */ ++ while ((*cp) && !(*cp == ' ' || *cp == ';' || *cp == ':')) ++ cp++; ++ /* replace comma or space with a null */ ++ if((*cp) && (*cp ==' ' ) && argv[count-1] != cp) ++ *cp++ = '\0'; ++ } ++ return (count); ++} ++ ++/* ++* qla2x00_display_fc_names ++* This routine will the node names of the different devices found ++* after port inquiry. ++* ++* Input: ++* cmd = SCSI command structure ++* ++* Returns: ++* None. ++*/ ++static void ++qla2x00_display_fc_names(scsi_qla_host_t *ha) ++{ ++ uint16_t tgt; ++ os_tgt_t *tq; ++ ++ /* Display the node name for adapter */ ++ printk(KERN_INFO ++ "scsi-qla%d-adapter-node=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ ha->init_cb->node_name[0], ++ ha->init_cb->node_name[1], ++ ha->init_cb->node_name[2], ++ ha->init_cb->node_name[3], ++ ha->init_cb->node_name[4], ++ ha->init_cb->node_name[5], ++ ha->init_cb->node_name[6], ++ ha->init_cb->node_name[7]); ++ ++ /* display the port name for adapter */ ++ printk(KERN_INFO ++ "scsi-qla%d-adapter-port=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ ha->init_cb->port_name[0], ++ ha->init_cb->port_name[1], ++ ha->init_cb->port_name[2], ++ ha->init_cb->port_name[3], ++ ha->init_cb->port_name[4], ++ ha->init_cb->port_name[5], ++ ha->init_cb->port_name[6], ++ ha->init_cb->port_name[7]); ++ ++ /* Print out device port names */ ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if ((tq = ha->otgt[tgt]) == NULL) ++ continue; ++ ++ if (tq->vis_port == NULL) ++ continue; ++ ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-0-port=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ tgt, ++ tq->port_name[0], ++ tq->port_name[1], ++ tq->port_name[2], ++ tq->port_name[3], ++ tq->port_name[4], ++ tq->port_name[5], ++ tq->port_name[6], ++ tq->port_name[7]); ++ ++ break; ++ ++ case BIND_BY_PORT_ID: ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-0-pid=" ++ "%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ tgt, ++ tq->d_id.b.domain, ++ tq->d_id.b.area, ++ tq->d_id.b.al_pa); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-0-node=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ tgt, ++ tq->node_name[0], ++ tq->node_name[1], ++ tq->node_name[2], ++ tq->node_name[3], ++ tq->node_name[4], ++ tq->node_name[5], ++ tq->node_name[6], ++ tq->node_name[7]); ++ break; ++ } ++ ++#if VSA ++ printk(KERN_INFO ++ "scsi-qla%d-target-%d-vsa=01;\n", (int)ha->instance, tgt); ++#endif ++ } ++} ++ ++/* ++ * qla2x00_suspend_lun ++ * Suspend lun and start port down timer ++ * ++ * Input: ++ * ha = visable adapter block pointer. ++ * lq = lun queue ++ * cp = Scsi command pointer ++ * time = time in seconds ++ * count = number of times to let time expire ++ * delay_lun = non-zero, if lun should be delayed rather than suspended ++ * ++ * Return: ++ * QL_STATUS_SUCCESS -- suspended lun ++ * QL_STATUS_ERROR -- Didn't suspend lun ++ * ++ * Context: ++ * Interrupt context. ++ */ ++uint8_t ++__qla2x00_suspend_lun(scsi_qla_host_t *ha, ++ os_lun_t *lq, int time, int count, int delay_lun) ++{ ++ srb_t *sp; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ uint8_t status; ++ ++ /* if the lun_q is already suspended then don't do it again */ ++ if (lq->q_state == LUN_STATE_READY ||lq->q_state == LUN_STATE_RUN) { ++ ++ spin_lock_irqsave(&lq->q_lock, flags); ++ if (lq->q_state == LUN_STATE_READY) { ++ lq->q_max = count; ++ lq->q_count = 0; ++ } ++ /* Set the suspend time usually 6 secs */ ++ atomic_set(&lq->q_timer, time); ++ ++ /* now suspend the lun */ ++ lq->q_state = LUN_STATE_WAIT; ++ ++ if (delay_lun) { ++ set_bit(LUN_EXEC_DELAYED, &lq->q_flag); ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): Delay lun execution for %d secs, " ++ "count=%d, max count=%d, state=%d\n", ++ ha->host_no, ++ time, ++ lq->q_count, lq->q_max, lq->q_state)); ++ } else { ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): Suspend lun for %d secs, count=%d, " ++ "max count=%d, state=%d\n", ++ ha->host_no, ++ time, ++ lq->q_count, lq->q_max, lq->q_state)); ++ } ++ spin_unlock_irqrestore(&lq->q_lock, flags); ++ ++ /* ++ * Remove all pending commands from request queue and put them ++ * in the scsi_retry queue. ++ */ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->pending_queue) { ++ sp = list_entry(list, srb_t, list); ++ if (sp->lun_queue != lq) ++ continue; ++ ++ __del_from_pending_queue(ha, sp); ++ ++ if (sp->cmd->allowed < count) ++ sp->cmd->allowed = count; ++ __add_to_scsi_retry_queue(ha,sp); ++ ++ } /* list_for_each_safe */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ status = QL_STATUS_SUCCESS; ++ } else { ++ status = QL_STATUS_ERROR; ++ } ++ ++ return (status); ++ ++} ++ ++/* ++ * qla2x00_mark_device_lost Updates fcport state when device goes offline. ++ * ++ * Input: ha = adapter block pointer. fcport = port structure pointer. ++ * ++ * Return: None. ++ * ++ * Context: ++ */ ++void qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ /* ++ * We may need to retry the login, so don't change the state of the ++ * port but do the retries. ++ */ ++ if (atomic_read(&fcport->state) != FC_DEVICE_DEAD) ++ atomic_set(&fcport->state, FC_DEVICE_LOST); ++ ++ if (fcport->login_retry == 0) { ++ fcport->login_retry = ha->login_retry_count; ++ set_bit(RELOGIN_NEEDED, &ha->dpc_flags); ++ ++ DEBUG(printk("scsi(%ld): Port login retry: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "id = 0x%04x retry cnt=%d\n", ++ ha->host_no, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id, ++ fcport->login_retry)); ++ } ++} ++ ++/* ++ * qla2x00_mark_all_devices_lost ++ * Updates fcport state when device goes offline. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = port structure pointer. ++ * ++ * Return: ++ * None. ++ * ++ * Context: ++ */ ++void ++qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha) ++{ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* ++ * No point in marking the device as lost, if the device is ++ * already DEAD. ++ */ ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) ++ continue; ++ ++ atomic_set(&fcport->state, FC_DEVICE_LOST); ++ } ++} ++ ++/* ++* qla2x00_mem_alloc ++* Allocates adapter memory. ++* ++* Returns: ++* 0 = success. ++* 1 = failure. ++*/ ++static uint8_t ++qla2x00_mem_alloc(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 1; ++ uint8_t i; ++ int retry= 10; ++ mbx_cmdq_t *ptmp; ++ mbx_cmdq_t *tmp_q_head; ++ mbx_cmdq_t *tmp_q_tail; ++ ++ ENTER(__func__); ++ ++ do { ++ /* ++ * This will loop only once if everything goes well, else some ++ * number of retries will be performed to get around a kernel ++ * bug where available mem is not allocated until after a ++ * little delay and a retry. ++ */ ++ ++#if defined(FC_IP_SUPPORT) ++ ha->risc_rec_q = pci_alloc_consistent(ha->pdev, ++ ((IP_BUFFER_QUEUE_DEPTH) * (sizeof(struct risc_rec_entry))), ++ &ha->risc_rec_q_dma); ++ if (ha->risc_rec_q == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "risc_rec_q\n", ++ ha->host_no); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++#endif /* #if defined(FC_IP_SUPPORT) */ ++ ++ ha->request_ring = pci_alloc_consistent(ha->pdev, ++ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))), ++ &ha->request_dma); ++ if (ha->request_ring == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "request_ring\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ ha->response_ring = pci_alloc_consistent(ha->pdev, ++ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(response_t))), ++ &ha->response_dma); ++ if (ha->response_ring == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "response_ring\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ /* get consistent memory allocated for init control block */ ++ ha->init_cb = pci_alloc_consistent(ha->pdev, ++ sizeof(init_cb_t), &ha->init_cb_dma); ++ if (ha->init_cb == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "init_cb\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ memset(ha->init_cb, 0, sizeof(init_cb_t)); ++ ++ /* Allocate ioctl related memory. */ ++ if (qla2x00_alloc_ioctl_mem(ha)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "ioctl_mem\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ if (qla2x00_allocate_sp_pool(ha)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "qla2x00_allocate_sp_pool()\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ /* ++ * Allocate an initial list of mailbox semaphore queue to be ++ * used for serialization of the mailbox commands. ++ */ ++ tmp_q_head = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 20); ++ if (tmp_q_head == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "mbx_cmd_q", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ha->mbx_sem_pool_head = tmp_q_head; ++ tmp_q_tail = tmp_q_head; ++ ++ /* Now try to allocate more */ ++ for (i = 1; i < MBQ_INIT_LEN; i++) { ++ ptmp = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 20 + i); ++ if (ptmp == NULL) { ++ /* ++ * Error. Just exit. If more is needed later ++ * they will be allocated at that time. ++ */ ++ break; ++ } ++ tmp_q_tail->pnext = ptmp; ++ tmp_q_tail = ptmp; ++ } ++ ha->mbx_sem_pool_tail = tmp_q_tail; ++ ++ /* Get consistent memory allocated for MS IOCB */ ++ ha->ms_iocb = pci_alloc_consistent(ha->pdev, ++ sizeof(ms_iocb_entry_t), &ha->ms_iocb_dma); ++ if (ha->ms_iocb == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - ms_iocb\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ memset(ha->ms_iocb, 0, sizeof(ms_iocb_entry_t)); ++ ++ /* Get consistent memory allocated for CT SNS commands */ ++ ha->ct_sns = pci_alloc_consistent(ha->pdev, ++ sizeof(struct ct_sns_pkt), &ha->ct_sns_dma); ++ if (ha->ct_sns == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - ct_sns\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); ++ ++ /* Done all allocations without any error. */ ++ status = 0; ++ ++ } while (retry-- && status != 0); ++ ++ if (status) { ++ printk(KERN_WARNING ++ "%s(): **** FAILED ****\n", __func__); ++ } ++ ++ LEAVE(__func__); ++ ++ return(status); ++} ++ ++/* ++* qla2x00_mem_free ++* Frees all adapter allocated memory. ++* ++* Input: ++* ha = adapter block pointer. ++*/ ++static void ++qla2x00_mem_free(scsi_qla_host_t *ha) ++{ ++ uint32_t t; ++ struct list_head *fcpl, *fcptemp; ++ fc_port_t *fcport; ++ struct list_head *fcll, *fcltemp; ++ fc_lun_t *fclun; ++ mbx_cmdq_t *ptmp; ++ mbx_cmdq_t *tmp_q_head; ++ unsigned long wtime;/* max wait time if mbx cmd is busy. */ ++ struct list_head *fcil, *fcitemp; ++ fc_initiator_t *fcinitiator; ++ ++ ENTER(__func__); ++ ++ if (ha == NULL) { ++ /* error */ ++ DEBUG2(printk("%s(): ERROR invalid ha pointer.\n", __func__)); ++ return; ++ } ++ ++ /* Free the target queues */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ qla2x00_tgt_free(ha, t); ++ } ++ ++ /* Make sure all other threads are stopped. */ ++ wtime = 60 * HZ; ++ while ((ha->dpc_wait != NULL || ha->mbx_q_head != NULL) && wtime) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ wtime = schedule_timeout(wtime); ++ } ++ ++ /* Now free the mbx sem pool */ ++ tmp_q_head = ha->mbx_sem_pool_head; ++ while (tmp_q_head != NULL) { ++ ptmp = tmp_q_head->pnext; ++ KMEM_FREE(tmp_q_head, sizeof(mbx_cmdq_t)); ++ tmp_q_head = ptmp; ++ } ++ ha->mbx_sem_pool_head = NULL; ++ ++ /* free ioctl memory */ ++ qla2x00_free_ioctl_mem(ha); ++ ++ /* Free host database. */ ++ list_for_each_safe(fcil, fcitemp, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ list_del(&fcinitiator->list); ++ kfree(fcinitiator); ++ } ++ INIT_LIST_HEAD(&ha->fcinitiators); ++ ++ /* free sp pool */ ++ qla2x00_free_sp_pool(ha); ++ ++ if (ha->ct_sns) { ++ pci_free_consistent(ha->pdev, ++ sizeof(struct ct_sns_pkt), ha->ct_sns, ha->ct_sns_dma); ++ } ++ if (ha->ms_iocb) { ++ pci_free_consistent(ha->pdev, ++ sizeof(ms_iocb_entry_t), ha->ms_iocb, ha->ms_iocb_dma); ++ } ++ ++ if (ha->init_cb) { ++ pci_free_consistent(ha->pdev, ++ sizeof(init_cb_t), ha->init_cb, ha->init_cb_dma); ++ } ++ ++ if (ha->request_ring) { ++ pci_free_consistent(ha->pdev, ++ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))), ++ ha->request_ring, ha->request_dma); ++ } ++ ++ if (ha->response_ring) { ++ pci_free_consistent(ha->pdev, ++ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(response_t))), ++ ha->response_ring, ha->response_dma); ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ if (ha->risc_rec_q) { ++ pci_free_consistent(ha->pdev, ++ ((IP_BUFFER_QUEUE_DEPTH) * (sizeof(struct risc_rec_entry))), ++ ha->risc_rec_q, ha->risc_rec_q_dma); ++ } ++ ha->risc_rec_q = NULL; ++ ha->risc_rec_q_dma = 0; ++#endif ++ ++ ha->ct_sns = NULL; ++ ha->ms_iocb = NULL; ++ ++ ha->init_cb = NULL; ++ ha->request_ring = NULL; ++ ha->request_dma = 0; ++ ha->response_ring = NULL; ++ ha->response_dma = 0; ++ ++ list_for_each_safe(fcpl, fcptemp, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* fc luns */ ++ list_for_each_safe(fcll, fcltemp, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ list_del_init(&fclun->list); ++ kfree(fclun); ++ } ++ ++ /* fc ports */ ++ list_del_init(&fcport->list); ++ kfree(fcport); ++ } ++ INIT_LIST_HEAD(&ha->fcports); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_allocate_sp_pool ++ * This routine is called during initialization to allocate ++ * memory for local srb_t. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ * ++ * Note: Sets the ref_count for non Null sp to one. ++ */ ++uint8_t ++qla2x00_allocate_sp_pool(scsi_qla_host_t *ha) ++{ ++ srb_t *sp; ++ int i; ++ uint8_t status = QL_STATUS_SUCCESS; ++ ++ ENTER(__func__); ++ ++ INIT_LIST_HEAD(&ha->free_queue); ++ ha->srb_alloc_cnt = 0; ++ ++ ha->srb_pool_order = get_order(max_srbs * sizeof(srb_t)); ++ ha->srb_pool = ++ (srb_t *) __get_free_pages(GFP_KERNEL, ha->srb_pool_order); ++ if (ha->srb_pool != NULL) { ++ for (i = 0, sp = ha->srb_pool; i < max_srbs; i++, sp++) { ++ memset(sp, 0, sizeof(srb_t)); ++ __add_to_free_queue (ha, sp); ++ sp->magic = SRB_MAGIC; ++ sp->ref_num = ha->srb_alloc_cnt; ++ sp->host_no = ha->host_no; ++ atomic_set(&sp->ref_count, 0); ++ ++ ha->srb_alloc_cnt++; ++ } ++ } ++ ++ /* ++ * If we fail to allocte memory return an error ++ */ ++ if (ha->srb_alloc_cnt == 0) ++ status = QL_STATUS_ERROR; ++ ++ printk(KERN_INFO ++ "scsi(%ld): Allocated %d SRB(s).\n", ++ ha->host_no, ha->srb_alloc_cnt); ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/* ++ * This routine frees all adapter allocated memory. ++ * ++ */ ++void ++qla2x00_free_sp_pool( scsi_qla_host_t *ha) ++{ ++ int cnt_free_srbs = 0; ++ srb_t *sp; ++ struct list_head *list, *temp; ++ ++ /* ++ * Count the number of entries, remove the entries from the list, then ++ * free the pool. ++ */ ++ list_for_each_safe(list, temp, &ha->free_queue) { ++ sp = list_entry(list, srb_t, list); ++ ++ __del_from_free_queue(ha, sp); ++ cnt_free_srbs++; ++ } ++ free_pages((unsigned long)ha->srb_pool, ha->srb_pool_order); ++ ++ if (cnt_free_srbs != ha->srb_alloc_cnt) { ++ DEBUG(printk("scsi(%ld): Did not free all srbs, Free count = " ++ "%d, Alloc Count = %d\n", ++ ha->host_no, cnt_free_srbs, ha->srb_alloc_cnt)); ++ printk(KERN_INFO ++ "scsi(%ld): Did not free all srbs, Free count = %d, " ++ "Alloc Count = %d\n", ++ ha->host_no, cnt_free_srbs, ha->srb_alloc_cnt); ++ } ++} ++ ++ ++ ++/************************************************************************** ++* qla2x00_do_dpc ++* This kernel thread is a task that is schedule by the interrupt handler ++* to perform the background processing for interrupts. ++* ++* Notes: ++* This task always run in the context of a kernel thread. It ++* is kick-off by the driver's detect code and starts up ++* up one per adapter. It immediately goes to sleep and waits for ++* some fibre event. When either the interrupt handler or ++* the timer routine detects a event it will one of the task ++* bits then wake us up. ++**************************************************************************/ ++static int ++qla2x00_do_dpc(void *data) ++{ ++ DECLARE_MUTEX_LOCKED(sem); ++ scsi_qla_host_t *ha; ++ fcdev_t dev; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_lun_t *q; ++ srb_t *sp; ++ uint8_t status; ++ uint32_t t; ++ unsigned long flags = 0; ++ struct list_head *list, *templist; ++ int dead_cnt, online_cnt; ++ ++ ha = (scsi_qla_host_t *)data; ++ ++ lock_kernel(); ++ ++ daemonize("%s_dpc%ld", DRIVER_NAME, ha->host_no); ++ allow_signal(SIGTERM); ++ ++ ha->dpc_wait = &sem; ++ ++ unlock_kernel(); ++ ++ complete(&ha->dpc_inited); ++ ++ while (1) { ++ /* ++ * If we get a signal, it means we are supposed to go ++ * away and die. This typically happens if the user is ++ * trying to unload a module. ++ */ ++ DEBUG3(printk("qla2x00: DPC handler sleeping\n")); ++ ++ down_interruptible(&sem); ++ ++ if (signal_pending(current)) ++ break; /* get out */ ++ ++ if (ha->dpc_should_die) ++ break; ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ DEBUG3(printk("qla2x00: DPC handler waking up\n")); ++ ++ /* Initialization not yet finished. Don't do anything yet. */ ++ if (!ha->init_done || ha->dpc_active) ++ continue; ++ ++ DEBUG3(printk("scsi(%ld): DPC handler\n", ha->host_no)); ++ ++ /* spin_lock_irqsave(&io_request_lock, ha->cpu_flags);*/ ++ ha->dpc_active = 1; ++ ++ /* Determine what action is necessary */ ++ ++ /* Process commands in retry queue */ ++ if (test_and_clear_bit(PORT_RESTART_NEEDED, &ha->dpc_flags)) { ++ DEBUG(printk("scsi(%ld): DPC checking retry_q. " ++ "total=%d\n", ++ ha->host_no, ha->retry_q_cnt)); ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ dead_cnt = online_cnt = 0; ++ list_for_each_safe(list, templist, &ha->retry_queue) { ++ sp = list_entry(list, srb_t, list); ++ q = sp->lun_queue; ++ DEBUG3(printk("scsi(%ld): pid=%ld sp=%p, " ++ "spflags=0x%x, q_flag= 0x%lx\n", ++ ha->host_no, ++ sp->cmd->serial_number, ++ sp, sp->flags, q->q_flag)); ++ ++ if (q == NULL) ++ continue; ++ fcport = q->fclun->fcport; ++ ++ if (atomic_read(&fcport->state) == ++ FC_DEVICE_DEAD) { ++ ++ __del_from_retry_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = ++ DID_NO_CONNECT << 16; ++ CMD_HANDLE(sp->cmd) = ++ (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ dead_cnt++; ++ } else if (atomic_read(&fcport->state) != ++ FC_DEVICE_LOST) { ++ ++ __del_from_retry_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = ++ DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = ++ (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ online_cnt++; ++ } ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ DEBUG(printk("scsi(%ld): done processing retry queue " ++ "- dead=%d, online=%d\n ", ++ ha->host_no, dead_cnt, online_cnt)); ++ } ++ ++ /* Process commands in scsi retry queue */ ++ if (test_and_clear_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags)) { ++ /* ++ * Any requests we want to delay for some period is put ++ * in the scsi retry queue with a delay added. The ++ * timer will schedule a "scsi_restart_needed" every ++ * second as long as there are requests in the scsi ++ * queue. ++ */ ++ DEBUG(printk("scsi(%ld): DPC checking scsi " ++ "retry_q.total=%d\n", ++ ha->host_no, ha->scsi_retry_q_cnt)); ++ ++ online_cnt = 0; ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, ++ templist, ++ &ha->scsi_retry_queue) { ++ ++ sp = list_entry(list, srb_t, list); ++ q = sp->lun_queue; ++ ++ DEBUG3(printk("scsi(%ld): scsi_retry_q: " ++ "pid=%ld sp=%p, spflags=0x%x, " ++ "q_flag= 0x%lx,q_state=%d\n", ++ ha->host_no, ++ sp->cmd->serial_number, ++ sp, sp->flags, q->q_flag, q->q_state)); ++ ++ /* Was this lun suspended */ ++ if (q->q_state != LUN_STATE_WAIT) { ++ online_cnt++; ++ __del_from_scsi_retry_queue(ha, sp); ++ __add_to_retry_queue(ha,sp); ++ } ++ ++ /* Was this command suspended for N secs */ ++ if (sp->delay != 0) { ++ sp->delay--; ++ if (sp->delay == 0) { ++ online_cnt++; ++ __del_from_scsi_retry_queue( ++ ha, sp); ++ __add_to_retry_queue(ha,sp); ++ } ++ } ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ DEBUG(if (online_cnt > 0)) ++ DEBUG(printk("scsi(%ld): dpc() found scsi reqs to " ++ "restart= %d\n", ++ ha->host_no, online_cnt)); ++ } ++ ++ if (ha->flags.mbox_busy) { ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ ha->dpc_active = 0; ++ continue; ++ } ++ ++ if (test_and_clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): dpc: sched " ++ "qla2x00_abort_isp ha = %p\n", ++ ha->host_no, ha)); ++ if (!(test_and_set_bit(ABORT_ISP_ACTIVE, ++ &ha->dpc_flags))) { ++ ++ if (qla2x00_abort_isp(ha, 0)) { ++ /* failed. retry later */ ++ set_bit(ISP_ABORT_NEEDED, ++ &ha->dpc_flags); ++ } ++ clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ } ++ DEBUG(printk("scsi(%ld): dpc: qla2x00_abort_isp end\n", ++ ha->host_no)); ++ } ++ ++ if (test_and_clear_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): Loop Reset Needed -- " ++ "calling qla2x00_loop_reset().\n", ++ ha->host_no)); ++ ++ qla2x00_loop_reset(ha); ++ } ++ ++ if (test_and_clear_bit(DEVICE_ABORT_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): Device Abort Needed -- " ++ "calling qla2x00_abort_device().\n", ++ ha->host_no)); ++ ++ t = ha->reset_tgt_id; ++ if (ha->otgt[t] && ha->otgt[t]->vis_port) ++ qla2x00_abort_device(ha, ++ ha->otgt[t]->vis_port->loop_id, ++ ha->reset_lun); ++ } ++ ++ if (test_and_clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) && ++ (!(test_and_set_bit(RESET_ACTIVE, &ha->dpc_flags)))) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_reset_marker()\n", ++ ha->host_no)); ++ ++ qla2x00_rst_aen(ha); ++ clear_bit(RESET_ACTIVE, &ha->dpc_flags); ++ } ++ ++ /* Retry each device up to login retry count */ ++ if ((test_and_clear_bit(RELOGIN_NEEDED, &ha->dpc_flags)) && ++ !test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) && ++ ha->loop_state != LOOP_DOWN) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_port_login()\n", ++ ha->host_no)); ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* ++ * If the port is not ONLINE then try to login ++ * to it if we haven't run out of retries. ++ */ ++ if (atomic_read(&fcport->state) != FC_ONLINE && ++ fcport->login_retry) { ++ ++ fcport->login_retry--; ++ memset(&dev, 0, sizeof(fcdev_t)); ++ dev.loop_id = fcport->old_loop_id; ++ dev.d_id.b24 = fcport->d_id.b24; ++ if (ha->fc_db[fcport->dev_id].flag & ++ DEV_PUBLIC) ++ status = qla2x00_fabric_login( ++ ha, &dev); ++ else ++ status = ++ qla2x00_local_device_login( ++ ha, ++ (dev.loop_id & 0xff)); ++ ++ if (status == QL_STATUS_SUCCESS) { ++ ha->fc_db[fcport->dev_id].loop_id = dev.loop_id; ++ fcport->loop_id = dev.loop_id; ++ fcport->old_loop_id = dev.loop_id; ++ ++ DEBUG(printk("scsi(%ld): port login OK: logged in ID 0x%x\n", ++ ha->host_no, fcport->loop_id)); ++ ++ fcport->port_login_retry_count = ++ ha->port_down_retry_count * PORT_RETRY_TIME; ++ atomic_set(&fcport->state, FC_ONLINE); ++ atomic_set(&fcport->port_down_timer, ++ ha->port_down_retry_count * PORT_RETRY_TIME); ++ ++ fcport->login_retry = 0; ++ } else if (status == 1) { ++ if (dev.loop_id != fcport->old_loop_id) { ++ fcport->old_loop_id = dev.loop_id; ++ ha->fc_db[fcport->dev_id].loop_id = dev.loop_id; ++ } ++ ++ set_bit(RELOGIN_NEEDED, &ha->dpc_flags); ++ /* retry the login again */ ++ DEBUG(printk("scsi(%ld): Retrying %d login again loop_id 0x%x\n", ++ ha->host_no, ++ fcport->login_retry, fcport->loop_id)); ++ } else { ++ fcport->login_retry = 0; ++ } ++ } ++ if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) ++ break; ++ } ++ DEBUG(printk("scsi(%ld): qla2x00_port_login - end\n", ++ ha->host_no)); ++ } ++ ++ if ((test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags)) && ++ ha->loop_state != LOOP_DOWN ) { ++ ++ clear_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); ++ DEBUG(printk("scsi(%ld): qla2x00_login_retry()\n", ++ ha->host_no)); ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_login_retry - end\n", ++ ha->host_no)); ++ } ++ ++ if (test_and_clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_loop_resync()\n", ++ ha->host_no)); ++ ++ if (!(test_and_set_bit(LOOP_RESYNC_ACTIVE, ++ &ha->dpc_flags))) { ++ ++ qla2x00_loop_resync(ha); ++ ++ clear_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags); ++ } ++ ++ DEBUG(printk("scsi(%ld): qla2x00_loop_resync - end\n", ++ ha->host_no)); ++ } ++ ++ if (ha->flags.failover_enabled) { ++ /* ++ * If we are not processing a ioctl or one of ++ * the ports are still MISSING or need a resync ++ * then process the failover event. ++ */ ++ if (!test_bit(CFG_ACTIVE, &ha->cfg_flags)) { ++ if (qla2x00_check_for_devices_online(ha)) { ++ if (test_and_clear_bit(FAILOVER_EVENT, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_cfg_event_notify()\n", ++ ha->host_no)); ++ ++ if (ha->flags.online) { ++ qla2x00_cfg_event_notify(ha, ha->failover_type); ++ } ++ ++ DEBUG(printk("scsi(%ld): qla2x00_cfg_event_notify - end\n", ++ ha->host_no)); ++ } ++ } ++ ++ if (test_and_clear_bit(FAILOVER_NEEDED, &ha->dpc_flags)) { ++ /* ++ * Get any requests from failover queue ++ */ ++ DEBUG(printk("scsi(%ld): qla2x00_process_failover()\n", ++ ha->host_no)); ++ ++ qla2x00_process_failover(ha); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_process_failover - end\n", ++ ha->host_no)); ++ } ++ } ++ } ++ ++ if (test_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags)) { ++ DEBUG(printk("scsi(%ld): qla2x00_restart_queues()\n", ++ ha->host_no)); ++ ++ qla2x00_restart_queues(ha,FALSE); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_restart_queues - end\n", ++ ha->host_no)); ++ } ++ ++ if (test_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_abort_queues()\n", ++ ha->host_no)); ++ ++ qla2x00_abort_queues(ha, FALSE); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_abort_queues - end\n", ++ ha->host_no)); ++ } ++ ++ if (!ha->interrupts_on) ++ qla2x00_enable_intrs(ha); ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ ha->dpc_active = 0; ++ } /* End of while(1) */ ++ ++ DEBUG(printk("scsi(%ld): DPC handler exiting\n", ha->host_no)); ++ ++ /* ++ * Make sure that nobody tries to wake us up again. ++ */ ++ ha->dpc_wait = NULL; ++ ha->dpc_active = 0; ++ ++ complete_and_exit(&ha->dpc_exited, 0); ++} ++ ++/* ++ * qla2x00_abort_queues ++ * Abort all commands on queues on device ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++void ++qla2x00_abort_queues(scsi_qla_host_t *ha, uint8_t doneqflg) ++{ ++ ++ srb_t *sp; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ ++ ENTER(__func__); ++ ++ clear_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags); ++ ++ /* Return all commands device queues. */ ++ spin_lock_irqsave(&ha->list_lock,flags); ++ list_for_each_safe(list, temp, &ha->pending_queue) { ++ sp = list_entry(list, srb_t, list); ++ ++ if (sp->flags & SRB_ABORTED) ++ continue; ++ ++ /* Remove srb from LUN queue. */ ++ __del_from_pending_queue(ha, sp); ++ ++ /* Set ending status. */ ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ ++ __add_to_done_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_check_for_devices_online ++ * ++ * Check fcport state of all devices to make sure online. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Return: ++ * None. ++ * ++ * Context: ++ */ ++static uint8_t ++qla2x00_check_for_devices_online(scsi_qla_host_t *ha) ++{ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ int found, cnt; ++ ++ found = 0; ++ cnt = 0; ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if ((atomic_read(&fcport->state) == FC_ONLINE) || ++ (atomic_read(&fcport->state) == FC_DEVICE_DEAD)) ++ found++; ++ ++ cnt++; ++ } ++ if (cnt == found) { ++ DEBUG5(printk("%s(%ld): all online\n", ++ __func__, ++ ha->host_no);) ++ return 1; ++ } else ++ return 0; ++} ++ ++/* ++* qla2x00_rst_aen ++* Processes asynchronous reset. ++* ++* Input: ++* ha = adapter block pointer. ++*/ ++static void ++qla2x00_rst_aen(scsi_qla_host_t *ha) ++{ ++ ENTER(__func__); ++ ++ if (ha->flags.online && !ha->flags.reset_active && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { ++ ++ /* 10/15 ha->flags.reset_active = TRUE; */ ++ do { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ++ /* ++ * Issue marker command only when we are going to start ++ * the I/O. ++ */ ++ ha->marker_needed = 1; ++ } while (!atomic_read(&ha->loop_down_timer) && ++ (test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags))); ++ ++ /* 10/15 ha->flags.reset_active = FALSE; */ ++ } ++ ++ LEAVE(__func__); ++} ++ ++ ++/* ++ * This routine will alloacte SP from the free queue ++ * input: ++ * scsi_qla_host_t * ++ * output: ++ * srb_t * or NULL ++ */ ++srb_t * ++qla2x00_get_new_sp(scsi_qla_host_t *ha) ++{ ++ srb_t * sp = NULL; ++ ulong flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ if (!list_empty(&ha->free_queue)) { ++ sp = list_entry(ha->free_queue.next, srb_t, list); ++ __del_from_free_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ if (sp) { ++#if defined(QL_DEBUG_LEVEL_4) ++ if ((int)atomic_read(&sp->ref_count) != 0) { ++ printk(KERN_WARNING ++ "scsi(%ld): WARNING ref_count not zero!\n", ++ ha->host_no); ++ } ++#endif ++ ++ sp_get(ha, sp); ++ } ++ ++ return (sp); ++} ++ ++/************************************************************************** ++* qla2x00_timer ++* ++* Description: ++* One second timer ++* ++* Context: Interrupt ++***************************************************************************/ ++static void ++qla2x00_timer(scsi_qla_host_t *ha) ++{ ++ int t,l; ++ unsigned long cpu_flags = 0; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ int start_dpc = 0; ++ ++ /* ++ * We try and restart any request in the retry queue every second. ++ */ ++ if (!list_empty(&ha->retry_queue)) { ++ set_bit(PORT_RESTART_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* ++ * We try and restart any request in the scsi_retry queue every second. ++ */ ++ if (!list_empty(&ha->scsi_retry_queue)) { ++ set_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* ++ * We try and failover any request in the failover queue every second. ++ */ ++ if (!list_empty(&ha->failover_queue)) { ++ set_bit(FAILOVER_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* ++ * Ports - Port down timer. ++ * ++ * Whenever, a port is in the LOST state we start decrementing its port ++ * down timer every second until it reaches zero. Once it reaches zero ++ * the port it marked DEAD. ++ */ ++ t = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (atomic_read(&fcport->state) == FC_DEVICE_LOST) { ++ ++ if (atomic_read(&fcport->port_down_timer) == 0) ++ continue; ++ ++ if (atomic_dec_and_test(&fcport->port_down_timer) != 0) ++ atomic_set(&fcport->state, FC_DEVICE_DEAD); ++ ++ DEBUG(printk("scsi(%ld): fcport-%d - port retry count: " ++ "%d remainning\n", ++ ha->host_no, ++ t, atomic_read(&fcport->port_down_timer))); ++ } ++ t++; ++ } /* End of for fcport */ ++ ++ /* ++ * LUNS - lun suspend timer. ++ * ++ * Whenever, a lun is suspended the timer starts decrementing its ++ * suspend timer every second until it reaches zero. Once it reaches ++ * zero the lun retry count is decremented. ++ */ ++ ++ /* ++ * FIXME(dg) - Need to convert this linear search of luns into a search ++ * of a list of suspended luns. ++ */ ++ for (t = 0; t < ha->max_targets; t++) { ++ if ((tq = ha->otgt[t]) == NULL) ++ continue; ++ ++ for (l = 0; l < ha->max_luns; l++) { ++ if ((lq = (os_lun_t *) tq->olun[l]) == NULL) ++ continue; ++ ++ spin_lock_irqsave(&lq->q_lock, cpu_flags); ++ if (lq->q_state == LUN_STATE_WAIT && ++ atomic_read(&lq->q_timer) != 0) { ++ ++ if (atomic_dec_and_test(&lq->q_timer) != 0) { ++ /* ++ * A delay should immediately ++ * transition to a READY state ++ */ ++ if (test_and_clear_bit(LUN_EXEC_DELAYED, ++ &lq->q_flag)) { ++ lq->q_state = LUN_STATE_READY; ++ } ++ else { ++ lq->q_count++; ++ if (lq->q_count == lq->q_max) ++ lq->q_state = ++ LUN_STATE_TIMEOUT; ++ else ++ lq->q_state = ++ LUN_STATE_RUN; ++ } ++ } ++ DEBUG3(printk("scsi(%ld): lun%d - timer %d, " ++ "count=%d, max=%d, state=%d\n", ++ ha->host_no, ++ l, ++ atomic_read(&lq->q_timer), ++ lq->q_count, lq->q_max, lq->q_state)); ++ } ++ spin_unlock_irqrestore(&lq->q_lock, cpu_flags); ++ } /* End of for luns */ ++ } /* End of for targets */ ++ ++ /* Loop down handler. */ ++ if (atomic_read(&ha->loop_down_timer) > 0 && ++ !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) && ha->flags.online) { ++ ++ /* dg 10/30 if (atomic_read(&ha->loop_down_timer) == LOOP_DOWN_TIME) { */ ++ if (atomic_read(&ha->loop_down_timer) == ++ ha->loop_down_abort_time ) { ++ ++ DEBUG(printk("scsi(%ld): Loop Down - aborting the " ++ "queues before time expire\n", ++ ha->host_no)); ++ ++ set_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* if the loop has been down for 4 minutes, reinit adapter */ ++ if (atomic_dec_and_test(&ha->loop_down_timer) != 0) { ++ DEBUG(printk("scsi(%ld): Loop down exceed 4 mins - " ++ "restarting queues.\n", ++ ha->host_no)); ++ ++ set_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ if (!(ha->device_flags & DFLG_NO_CABLE) && ++ qla2x00_reinit && !ha->flags.failover_enabled) { ++ ++ DEBUG(printk("scsi(%ld): Loop down - " ++ "aborting ISP.\n", ++ ha->host_no)); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ } ++ DEBUG3(printk("scsi(%ld): Loop Down - seconds remainning %d\n", ++ ha->host_no, ++ atomic_read(&ha->loop_down_timer))); ++ } ++ ++ /* ++ * Done Q Handler -- dgFIXME This handler will kick off doneq if we ++ * haven't process it in 2 seconds. ++ */ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++#if QLA2100_LIPTEST ++ /* ++ * This block is used to periodically schedule isp abort after ++ * qla2x00_lip flag is set. ++ */ ++ ++ /* ++ if (qla2x00_lip && (ha->forceLip++) == (60*2)) { ++ printk("timer: schedule isp abort.\n"); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ ha->forceLip = 0; ++ } ++ */ ++ ++ /* ++ * This block is used to periodically schedule mailbox cmd timeout ++ * simulation ++ */ ++ if (qla2x00_lip && (ha->forceLip++) == (60*6)) { ++ printk("qla2x00_timer: Going to force mbx timeout\n"); ++ ++ ha->forceLip = 0; ++ mbxtimeout = 1; ++ } ++#endif ++ ++ if (test_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags)) { ++ if (ha->failback_delay) { ++ ha->failback_delay--; ++ if (ha->failback_delay == 0) { ++ set_bit(FAILOVER_EVENT, &ha->dpc_flags); ++ clear_bit(FAILOVER_EVENT_NEEDED, ++ &ha->dpc_flags); ++ } ++ } else { ++ set_bit(FAILOVER_EVENT, &ha->dpc_flags); ++ clear_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags); ++ } ++ } ++ ++ /* Schedule the DPC routine if needed */ ++ if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || ++ start_dpc || ++ test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) || ++ test_bit(FAILOVER_EVENT, &ha->dpc_flags) || ++ test_bit(FAILOVER_NEEDED, &ha->dpc_flags) || ++ test_bit(MAILBOX_CMD_NEEDED, &ha->dpc_flags)) && ++ ha->dpc_wait && !ha->dpc_active ) { ++ ++ up(ha->dpc_wait); ++ } ++ ++ qla2x00_restart_timer(ha, WATCH_INTERVAL); ++} ++ ++/* ++ * qla2x00_extend_timeout ++ * This routine will extend the timeout to the specified value. ++ * ++ * Input: ++ * cmd = SCSI command structure ++ * ++ * Returns: ++ * None. ++ */ ++void ++qla2x00_extend_timeout(Scsi_Cmnd *cmd, int timeout) ++{ ++ srb_t *sp = (srb_t *) CMD_SP(cmd); ++ u_long our_jiffies = (timeout * HZ) + jiffies; ++ ++ sp->ext_history= 0; ++ sp->e_start = jiffies; ++ if (cmd->eh_timeout.function) { ++ mod_timer(&cmd->eh_timeout,our_jiffies); ++ sp->ext_history |= 1; ++ } ++ if (sp->timer.function != NULL) { ++ /* ++ * Our internal timer should timeout before the midlayer has a ++ * chance begin the abort process ++ */ ++ mod_timer(&sp->timer,our_jiffies - (QLA_CMD_TIMER_DELTA * HZ)); ++ ++ sp->ext_history |= 2; ++ } ++} ++ ++/************************************************************************** ++* qla2x00_cmd_timeout ++* ++* Description: ++* Handles the command if it times out in any state. ++* ++* Input: ++* sp - pointer to validate ++* ++* Returns: ++* None. ++* Note:Need to add the support for if( sp->state == SRB_FAILOVER_STATE). ++**************************************************************************/ ++static void ++qla2x00_cmd_timeout(srb_t *sp) ++{ ++ int t, l; ++ int processed; ++ scsi_qla_host_t *vis_ha, *dest_ha; ++ Scsi_Cmnd *cmd; ++ ulong flags; ++#if defined(QL_DEBUG_LEVEL_3) ++ ulong cpu_flags; ++#endif ++ fc_port_t *fcport; ++ ++ cmd = sp->cmd; ++ vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++ DEBUG3(printk("cmd_timeout: Entering sp->state = %x\n", sp->state)); ++ ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ fcport = sp->fclun->fcport; ++ dest_ha = sp->ha; ++ ++ /* ++ * If IO is found either in retry Queue ++ * OR in Lun Queue ++ * Return this IO back to host ++ */ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ processed = 0; ++ if (sp->state == SRB_PENDING_STATE) { ++ __del_from_pending_queue(vis_ha, sp); ++ DEBUG2(printk("scsi(%ld): Found in Pending queue pid %ld, " ++ "State = %x., fcport state=%d jiffies=%lx\n", ++ vis_ha->host_no, ++ sp->cmd->serial_number, sp->state, ++ atomic_read(&fcport->state), jiffies)); ++ ++ /* ++ * If FC_DEVICE is marked as dead return the cmd with ++ * DID_NO_CONNECT status. Otherwise set the host_byte to ++ * DID_BUS_BUSY to let the OS retry this cmd. ++ */ ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) { ++ cmd->result = DID_NO_CONNECT << 16; ++ } else { ++ cmd->result = DID_BUS_BUSY << 16; ++ } ++ __add_to_done_queue(vis_ha, sp); ++ processed++; ++ } ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ ++ if (processed) { ++ schedule_work(&vis_ha->run_qla_task); ++ ++ return; ++ } ++ ++ spin_lock_irqsave(&dest_ha->list_lock, flags); ++ if ((sp->state == SRB_RETRY_STATE) || ++ (sp->state == SRB_SCSI_RETRY_STATE) || ++ (sp->state == SRB_FAILOVER_STATE)) { ++ ++ DEBUG2(printk("scsi(%ld): Found in (Scsi) Retry queue or " ++ "failover Q pid %ld, State = %x., fcport state=%d " ++ "jiffies=%lx retried=%d\n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, sp->state, ++ atomic_read(&fcport->state), ++ jiffies, sp->cmd->retries)); ++ ++ if ((sp->state == SRB_RETRY_STATE)) { ++ __del_from_retry_queue(dest_ha, sp); ++ } else if ((sp->state == SRB_SCSI_RETRY_STATE)) { ++ __del_from_scsi_retry_queue(dest_ha, sp); ++ } else if ((sp->state == SRB_FAILOVER_STATE)) { ++ __del_from_failover_queue(dest_ha, sp); ++ } ++ ++ /* ++ * If FC_DEVICE is marked as dead return the cmd with ++ * DID_NO_CONNECT status. Otherwise set the host_byte to ++ * DID_BUS_BUSY to let the OS retry this cmd. ++ */ ++ if (dest_ha->flags.failover_enabled) { ++ cmd->result = DID_BUS_BUSY << 16; ++ } else { ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) { ++ cmd->result = DID_NO_CONNECT << 16; ++ qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT); ++ } else { ++ cmd->result = DID_BUS_BUSY << 16; ++ } ++ } ++ ++ __add_to_done_queue(dest_ha, sp); ++ processed++; ++ } ++ spin_unlock_irqrestore(&dest_ha->list_lock, flags); ++ ++ if (processed) { ++ schedule_work(&dest_ha->run_qla_task); ++ ++ return; ++ } ++/* TODO: Remove this code!!! */ ++#if defined(QL_DEBUG_LEVEL_3) ++ spin_lock_irqsave(&dest_ha->list_lock, cpu_flags); ++ if (sp->state == SRB_DONE_STATE) { ++ /* IO in done_q -- leave it */ ++ DEBUG(printk("scsi(%ld): Found in Done queue pid %ld sp=%p.\n", ++ dest_ha->host_no, sp->cmd->serial_number, sp)); ++ } else if (sp->state == SRB_SUSPENDED_STATE) { ++ DEBUG(printk("scsi(%ld): Found SP %p in suspended state " ++ "- pid %d:\n", ++ dest_ha->host_no,sp, ++ (int)sp->cmd->serial_number)); ++ DEBUG(qla2x00_dump_buffer((uint8_t *)sp, sizeof(srb_t));) ++ } else if (sp->state == SRB_ACTIVE_STATE) { ++ /* ++ * IO is with ISP find the command in our active list. ++ */ ++ spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags); ++ spin_lock_irqsave(&dest_ha->hardware_lock, flags); ++ if (sp == ++ dest_ha->outstanding_cmds[(u_long)CMD_HANDLE(sp->cmd)]) { ++ ++ DEBUG(printk("cmd_timeout: Found in ISP \n");) ++ ++ sp->state = SRB_ACTIVE_TIMEOUT_STATE; ++ spin_unlock_irqrestore(&dest_ha->hardware_lock, flags); ++ } else { ++ spin_unlock_irqrestore(&dest_ha->hardware_lock, flags); ++ printk(KERN_INFO ++ "qla_cmd_timeout: State indicates it is with " ++ "ISP, But not in active array\n"); ++ } ++ spin_lock_irqsave(&dest_ha->list_lock, cpu_flags); /* 01/03 */ ++ } else if (sp->state == SRB_ACTIVE_TIMEOUT_STATE) { ++ DEBUG(printk("qla2100%ld: Found in Active timeout state" ++ "pid %ld, State = %x., \n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, sp->state);) ++ } else { ++ /* EMPTY */ ++ DEBUG2(printk("cmd_timeout%ld: LOST command state = " ++ "0x%x, sp=%p\n", ++ vis_ha->host_no, sp->state,sp);) ++ ++ printk(KERN_INFO ++ "cmd_timeout: LOST command state = 0x%x\n", sp->state); ++ } ++ spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags); ++#endif ++ ++ DEBUG3(printk("cmd_timeout: Leaving\n");) ++} ++ ++/* ++ * qla2x00_done_work ++ * ++ * This is a task to process completion only similar to a ++ * bottom half handler. ++ * ++ * Input: ++ * p -- pointer to hba struct ++ * ++ */ ++void ++qla2x00_done_work(void *p) ++{ ++ scsi_qla_host_t *ha = (scsi_qla_host_t *) p; ++ ++ ENTER(__func__); ++ ++ set_bit(TASKLET_SCHED, &ha->dpc_flags); ++ ++ if (!list_empty(&ha->done_queue)) ++ qla2x00_done(ha); ++ ++ clear_bit(TASKLET_SCHED, &ha->dpc_flags); ++ ++ LEAVE(__func__); ++} ++ ++ ++/************************************************************************** ++* qla2x00_done ++* Process completed commands. ++* ++* Input: ++* old_ha = adapter block pointer. ++* ++* Returns: ++* int ++**************************************************************************/ ++int ++qla2x00_done(scsi_qla_host_t *old_ha) ++{ ++ os_lun_t *lq; ++ Scsi_Cmnd *cmd; ++ unsigned long flags = 0; ++ scsi_qla_host_t *ha; ++ scsi_qla_host_t *vis_ha; ++ int cnt; ++ int send_marker_once = 0; ++ struct list_head *spl, *sptemp; ++ srb_t *sp; ++ struct list_head local_sp_list; ++ ++ ENTER(__func__); ++ ++ if (test_bit(DONE_RUNNING, &old_ha->dpc_flags)) ++ return (0); ++ ++ set_bit(DONE_RUNNING, &old_ha->dpc_flags); ++ cnt = 0; ++ ++ INIT_LIST_HEAD(&local_sp_list); ++ ++ /* ++ * Get into local queue such that we do not wind up calling done queue ++ * takslet for the same IOs from DPC or any other place. ++ */ ++ spin_lock_irqsave(&old_ha->list_lock,flags); ++ list_for_each_safe(spl, sptemp, &old_ha->done_queue) { ++ sp = list_entry(spl, srb_t, list); ++ ++ /* remove command from done list */ ++ list_del_init(&sp->list); ++ ++ old_ha->done_q_cnt--; ++ sp->state = SRB_NO_QUEUE_STATE; ++ ++ /* add to local queue */ ++ list_add_tail(&sp->list, &local_sp_list); ++ } ++ spin_unlock_irqrestore(&old_ha->list_lock, flags); ++ ++ /* ++ * All done commands are in the local queue, now do the call back. ++ */ ++ list_for_each_safe(spl, sptemp, &local_sp_list) { ++ sp = list_entry(spl, srb_t, list); ++ ++ /* remove command from local list */ ++ list_del_init(&sp->list); ++ ++ cnt++; ++ ++ cmd = sp->cmd; ++ if (cmd == NULL) ++ continue; ++ ++ vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ lq = sp->lun_queue; ++ ha = lq->fclun->fcport->ha; ++ ++ if (sp->flags & SRB_DMA_VALID) { ++ sp->flags &= ~SRB_DMA_VALID; ++ ++ /* 4.10 64 and 32 bit */ ++ /* Release memory used for this I/O */ ++ if (cmd->use_sg) { ++ pci_unmap_sg(ha->pdev, ++ cmd->request_buffer, ++ cmd->use_sg, ++ scsi_to_pci_dma_dir( ++ cmd->sc_data_direction)); ++ } else if (cmd->request_bufflen) { ++ pci_unmap_page(ha->pdev, ++ sp->saved_dma_handle, ++ cmd->request_bufflen, ++ scsi_to_pci_dma_dir( ++ cmd->sc_data_direction)); ++ } ++ } ++ ++ if (!(sp->flags & SRB_IOCTL) && ha->flags.failover_enabled) { ++ /* ++ * This routine checks for DID_NO_CONNECT to decide ++ * whether to failover to another path or not. We only ++ * failover on that status. ++ */ ++ if (qla2x00_fo_check(ha,sp)) { ++ if ((sp->state != SRB_FAILOVER_STATE)) { ++ /* ++ * Retry the command on this path ++ * several times before selecting a new ++ * path. ++ */ ++ add_to_pending_queue_head(vis_ha, sp); ++ qla2x00_next(vis_ha); ++ } ++ else { ++ /* we failover this path */ ++ qla2x00_extend_timeout(sp->cmd, ++ EXTEND_CMD_TIMEOUT); ++ } ++ continue; ++ } ++ ++ } ++ ++ switch ((CMD_RESULT(cmd)>>16)) { ++ case DID_OK: ++ case DID_ERROR: ++ break; ++ ++ case DID_RESET: ++ /* ++ * Set marker needed, so we don't have to ++ * send multiple markers ++ */ ++ if (!send_marker_once) { ++ ha->marker_needed = 1; ++ send_marker_once++; ++ } ++ ++ /* ++ * WORKAROUND ++ * ++ * A backdoor device-reset requires different ++ * error handling. This code differentiates ++ * between normal error handling and the ++ * backdoor method. ++ * ++ */ ++ if (ha->host->eh_active != EH_ACTIVE) ++ CMD_RESULT(sp->cmd) = ++ DID_BUS_BUSY << 16; ++ break; ++ ++ ++ case DID_ABORT: ++ sp->flags &= ~SRB_ABORT_PENDING; ++ sp->flags |= SRB_ABORTED; ++ ++ if (sp->flags & SRB_TIMEOUT) ++ CMD_RESULT(cmd)= DID_TIME_OUT << 16; ++ ++ break; ++ ++ default: ++ DEBUG2(printk("scsi(%ld:%d:%d) %s: did_error " ++ "= %d, comp-scsi= 0x%x-0x%x.\n", ++ vis_ha->host_no, ++ SCSI_TCN_32(cmd), ++ SCSI_LUN_32(cmd), ++ __func__, ++ (CMD_RESULT(cmd)>>16), ++ CMD_COMPL_STATUS(cmd), ++ CMD_SCSI_STATUS(cmd))); ++ break; ++ } ++ ++ /* ++ * Call the mid-level driver interrupt handler -- via sp_put() ++ */ ++ sp_put(ha, sp); ++ ++ qla2x00_next(vis_ha); ++ ++ } /* end of while */ ++ clear_bit(DONE_RUNNING, &old_ha->dpc_flags); ++ ++ LEAVE(__func__); ++ ++ return (cnt); ++} ++ ++/* ++ * qla2x00_next ++ * Retrieve and process next job in the LUN queue. ++ * ++ * Input: ++ * tq = SCSI target queue pointer. ++ * lq = SCSI LUN queue pointer. ++ * TGT_LOCK must be already obtained. ++ * ++ * Output: ++ * Releases TGT_LOCK upon exit. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ * ++ * Note: This routine will always try to start I/O from visible HBA. ++ */ ++void ++qla2x00_next(scsi_qla_host_t *vis_ha) ++{ ++ scsi_qla_host_t *dest_ha; ++ fc_port_t *fcport; ++ srb_t *sp; ++ int rval; ++ unsigned long flags; ++ ++ ENTER(__func__); ++ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ while (!list_empty(&vis_ha->pending_queue)) { ++ sp = list_entry(vis_ha->pending_queue.next, srb_t, list); ++ ++ fcport = sp->fclun->fcport; ++ dest_ha = fcport->ha; ++ ++ /* Check if command can be started, exit if not. */ ++ if (LOOP_TRANSITION(dest_ha)) { ++ break; ++ } ++ ++ __del_from_pending_queue(vis_ha, sp); ++ ++ /* If device is dead then send request back to OS */ ++ if ((dest_ha->flags.link_down_error_enable && ++ atomic_read(&fcport->state) == FC_DEVICE_DEAD)) { ++ ++ CMD_RESULT(sp->cmd) = DID_NO_CONNECT << 16; ++ ++ if (!atomic_read(&dest_ha->loop_down_timer) && ++ dest_ha->loop_state == LOOP_DOWN) { ++ sp->err_id = 2; ++ } else { ++ sp->err_id = 1; ++ } ++ DEBUG3(printk("scsi(%ld): loop/port is down - " ++ "pid=%ld, sp=%p loopid=0x%x queued to dest HBA " ++ "scsi%ld.\n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, sp, ++ fcport->loop_id, dest_ha->host_no)); ++ /* ++ * Initiate a failover - done routine will initiate. ++ */ ++ __add_to_done_queue(vis_ha, sp); ++ ++ continue; ++ } ++ ++ /* ++ * SCSI Kluge: Whenever, we need to wait for an event such as ++ * loop down (i.e. loop_down_timer ) or port down (i.e. LUN ++ * request qeueue is suspended) then we will recycle new ++ * commands back to the SCSI layer. We do this because this is ++ * normally a temporary condition and we don't want the ++ * mid-level scsi.c driver to get upset and start aborting ++ * commands. The timeout value is extracted from the command ++ * minus 1-second and put on a retry queue (watchdog). Once the ++ * command timeout it is returned to the mid-level with a BUSY ++ * status, so the mid-level will retry it. This process ++ * continues until the LOOP DOWN time expires or the condition ++ * goes away. ++ */ ++ if (!(sp->flags & SRB_IOCTL) && ++ (atomic_read(&fcport->state) != FC_ONLINE || ++ test_bit(ABORT_ISP_ACTIVE, &dest_ha->dpc_flags) || ++ (dest_ha->loop_state != LOOP_READY) || ++ (sp->flags & SRB_FAILOVER))) { ++ ++ DEBUG3(printk("scsi(%ld): port=(0x%x) retry_q(%d) " ++ "loop state = %d, loop counter = 0x%x dpc flags " ++ "= 0x%lx\n", ++ dest_ha->host_no, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ dest_ha->loop_state, ++ atomic_read(&dest_ha->loop_down_timer), ++ dest_ha->dpc_flags)); ++ ++ qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT); ++ __add_to_retry_queue(vis_ha, sp); ++ ++ continue; ++ } ++ ++ /* ++ * If this request's lun is suspended then put the request on ++ * the scsi_retry queue. ++ */ ++ if (!(sp->flags & SRB_IOCTL) && ++ sp->lun_queue->q_state == LUN_STATE_WAIT) { ++ DEBUG3(printk("scsi(%ld): lun wait state - pid=%ld, " ++ "opcode=%d, allowed=%d, retries=%d\n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, ++ sp->cmd->cmnd[0], ++ sp->cmd->allowed, ++ sp->cmd->retries)); ++ ++ __add_to_scsi_retry_queue(vis_ha, sp); ++ ++ continue; ++ } ++ ++ sp->lun_queue->io_cnt++; ++ ++ /* Release target queue lock */ ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ ++ rval = qla2x00_start_scsi(sp); ++ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /* Place request back on top of device queue */ ++ /* add to the top of queue */ ++ __add_to_pending_queue_head(vis_ha, sp); ++ ++ sp->lun_queue->io_cnt--; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_flush_failover_queue ++ * Return cmds of a "specific" LUN from the failover queue with ++ * DID_BUS_BUSY status. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * q = lun queue. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++void ++qla2x00_flush_failover_q(scsi_qla_host_t *ha, os_lun_t *q) ++{ ++ srb_t *sp; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->failover_queue) { ++ sp = list_entry(list, srb_t, list); ++ /* ++ * If request originated from the same lun_q then delete it ++ * from the failover queue ++ */ ++ if (q == sp->lun_queue) { ++ /* Remove srb from failover queue. */ ++ __del_from_failover_queue(ha,sp); ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ } ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++ ++/* ++ * qla2x00_reset_lun_fo_counts ++ * Reset failover retry counts ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++void ++qla2x00_reset_lun_fo_counts(scsi_qla_host_t *ha, os_lun_t *lq) ++{ ++ srb_t *tsp; ++ os_lun_t *orig_lq; ++ struct list_head *list; ++ unsigned long flags ; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ /* ++ * the pending queue. ++ */ ++ list_for_each(list,&ha->pending_queue) { ++ tsp = list_entry(list, srb_t, list); ++ orig_lq = tsp->lun_queue; ++ if (orig_lq == lq) ++ tsp->fo_retry_cnt = 0; ++ } ++ /* ++ * the retry queue. ++ */ ++ list_for_each(list,&ha->retry_queue) { ++ tsp = list_entry(list, srb_t, list); ++ orig_lq = tsp->lun_queue; ++ if (orig_lq == lq) ++ tsp->fo_retry_cnt = 0; ++ } ++ ++ /* ++ * the done queue. ++ */ ++ list_for_each(list, &ha->done_queue) { ++ tsp = list_entry(list, srb_t, list); ++ orig_lq = tsp->lun_queue; ++ if (orig_lq == lq) ++ tsp->fo_retry_cnt = 0; ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++/* ++ * qla2x00_failover_cleanup ++ * Cleanup queues after a failover. ++ * ++ * Input: ++ * sp = command pointer ++ * ++ * Context: ++ * Interrupt context. ++ */ ++static void ++qla2x00_failover_cleanup(srb_t *sp) ++{ ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ ++ /* turn-off all failover flags */ ++ sp->flags = sp->flags & ~(SRB_RETRY|SRB_FAILOVER|SRB_FO_CANCEL); ++} ++ ++ ++/* ++ * qla2x00_process_failover ++ * Process any command on the failover queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++static void ++qla2x00_process_failover(scsi_qla_host_t *ha) ++{ ++ ++ os_tgt_t *tq; ++ os_lun_t *lq; ++ srb_t *sp; ++ fc_port_t *fcport; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ uint32_t t, l; ++ scsi_qla_host_t *vis_ha = NULL; ++ ++ DEBUG(printk("scsi(%ld): Processing failover for hba.\n", ha->host_no)); ++ ++ /* ++ * Process all the commands in the failover queue. Attempt to failover ++ * then either complete the command as is or requeue for retry. ++ */ ++ ++ /* Prevent or allow acceptance of new I/O requests. */ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ /* ++ * Get first entry to find our visible adapter. We could never get ++ * here if the list is empty ++ */ ++ list = ha->failover_queue.next; ++ sp = list_entry(list, srb_t, list); ++ vis_ha = (scsi_qla_host_t *) sp->cmd->device->host->hostdata; ++ list_for_each_safe(list, temp, &ha->failover_queue) { ++ sp = list_entry(list, srb_t, list); ++ ++ tq = sp->tgt_queue; ++ lq = sp->lun_queue; ++ fcport = lq->fclun->fcport; ++ ++ /* Remove srb from failover queue. */ ++ __del_from_failover_queue(ha, sp); ++ ++ DEBUG2(printk("%s(): pid %ld retrycnt=%d\n", ++ __func__, sp->cmd->serial_number, sp->cmd->retries)); ++ ++ /*** Select an alternate path ***/ ++ /* ++ * If the path has already been change by a previous request ++ * sp->fclun != lq->fclun ++ */ ++ if (sp->fclun != lq->fclun || ++ atomic_read(&fcport->state) != FC_DEVICE_DEAD) { ++ ++ qla2x00_failover_cleanup(sp); ++ ++ } else if (qla2x00_cfg_failover(ha, ++ lq->fclun, tq, sp) == NULL) { ++ ++ /* ++ * We ran out of paths, so just post the status which ++ * is already set in the cmd. ++ */ ++ printk(KERN_INFO ++ "scsi(%ld): Ran out of paths - pid %ld\n", ++ ha->host_no, sp->cmd->serial_number); ++ } else { ++ qla2x00_failover_cleanup(sp); ++ ++ } ++ __add_to_done_queue(ha, sp); ++ } /* list_for_each_safe */ ++ spin_unlock_irqrestore(&ha->list_lock,flags); ++ ++ for (t = 0; t < vis_ha->max_targets; t++) { ++ if ((tq = vis_ha->otgt[t]) == NULL) ++ continue; ++ for (l = 0; l < vis_ha->max_luns; l++) { ++ if ((lq = (os_lun_t *) tq->olun[l]) == NULL) ++ continue; ++ ++ if( test_and_clear_bit(LUN_MPIO_BUSY, &lq->q_flag) ) { ++ /* EMPTY */ ++ DEBUG(printk("scsi(%ld): remove suspend for " ++ "lun %d\n", ha->host_no, lq->fclun->lun)); ++ } ++ } ++ } ++ ++ //qla2x00_restart_queues(ha,TRUE); ++ qla2x00_restart_queues(ha, FALSE); ++ ++ DEBUG(printk("%s() - done", __func__)); ++} ++ ++/************************************************************************** ++* qla2x00_check_tgt_status ++* ++* Description: ++* Checks to see if the target or loop is down. ++* ++* Input: ++* cmd - pointer to Scsi cmd structure ++* ++* Returns: ++* 1 - if target is present ++* 0 - if target is not present ++* ++**************************************************************************/ ++uint8_t ++qla2x00_check_tgt_status(scsi_qla_host_t *ha, Scsi_Cmnd *cmd) ++{ ++ os_lun_t *lq; ++ uint32_t b, t, l; ++ fc_port_t *fcport; ++ ++ /* Generate LU queue on bus, target, LUN */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ if ((lq = GET_LU_Q(ha,t,l)) == NULL) { ++ return(QL_STATUS_ERROR); ++ } ++ ++ fcport = lq->fclun->fcport; ++ ++ if (TGT_Q(ha, t) == NULL || ++ l >= ha->max_luns || ++ (atomic_read(&fcport->state) == FC_DEVICE_DEAD) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ++ ha->loop_state != LOOP_READY) { ++ ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld:%2d:%2d:%2d): %s connection is down\n", ++ ha->host_no, ++ b, t, l, ++ __func__)); ++ ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ return(QL_STATUS_ERROR); ++ } ++ return (QL_STATUS_SUCCESS); ++} ++ ++/************************************************************************** ++* qla2x00_check_port_status ++* ++* Description: ++* Checks to see if the port or loop is down. ++* ++* Input: ++* fcport - pointer to fc_port_t structure. ++* ++* Returns: ++* 1 - if port is present ++* 0 - if port is not present ++* ++**************************************************************************/ ++uint8_t ++qla2x00_check_port_status(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ uint32_t port_state; ++ ++ if (fcport == NULL) { ++ return(QL_STATUS_ERROR); ++ } ++ ++ port_state = (uint32_t)atomic_read(&fcport->state); ++ if ((port_state != FC_ONLINE) || ++ (port_state == FC_DEVICE_DEAD) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ ABORTS_ACTIVE || ha->loop_state != LOOP_READY) { ++ ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): Connection is down. fcport=%p.\n", ++ ha->host_no, fcport)); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/****************************************************************************/ ++/* Create character driver "HbaApiDev" w dynamically allocated major number */ ++/* and create "/proc/scsi/qla2x00/HbaApiNode" as the device node associated */ ++/* with the major number. */ ++/****************************************************************************/ ++ ++#define APIDEV_NODE "HbaApiNode" ++#define APIDEV_NAME "HbaApiDev" ++ ++static int apidev_major = 0; ++static struct Scsi_Host *apidev_host = 0; ++ ++static struct file_operations apidev_fops = { ++ .ioctl = apidev_ioctl, ++ .open = apidev_open, ++ .release = apidev_close, ++}; ++ ++static int ++apidev_init(struct Scsi_Host *host) ++{ ++ if (apidev_host) ++ return (0); ++ ++ apidev_major = register_chrdev(0, APIDEV_NAME, &apidev_fops); ++ if (0 > apidev_major) { ++ DEBUG(printk("%s(): register_chrdev rc=%d\n", ++ __func__, apidev_major)); ++ ++ return (apidev_major); ++ } ++ ++ apidev_host = host; ++ ++ DEBUG(printk("%s(): Creating (%s) %s/%s major=%d\n", ++ __func__, ++ host->hostt->proc_name, host->hostt->proc_dir->name, ++ APIDEV_NODE, apidev_major)); ++ ++ proc_mknod(APIDEV_NODE, 0777+S_IFCHR, host->hostt->proc_dir, ++ (kdev_t)mk_kdev(apidev_major, 0)); ++ ++ return 0; ++} ++ ++static int apidev_cleanup() ++{ ++ if (!apidev_host) ++ return (0); ++ ++ unregister_chrdev(apidev_major,APIDEV_NAME); ++ remove_proc_entry(APIDEV_NODE,apidev_host->hostt->proc_dir); ++ apidev_host = 0; ++ ++ return (0); ++} ++ ++static int ++apidev_open(struct inode *inode, struct file *file) ++{ ++ DEBUG9(printk(KERN_INFO ++ "%s(): open MAJOR number = %d, MINOR number = %d\n", ++ __func__, major(inode->i_rdev), minor(inode->i_rdev))); ++ ++ return 0; ++} ++ ++static int ++apidev_close(struct inode *inode, struct file *file) ++{ ++ DEBUG9(printk(KERN_INFO ++ "%s(): closed\n", __func__)); ++ ++ return 0; ++} ++ ++static int ++apidev_ioctl(struct inode *inode, ++ struct file *fp, unsigned int cmd, unsigned long arg) ++{ ++ /* ++ * Since this var is not really used, use static type to conserve ++ * stack space. ++ */ ++ static Scsi_Device dummy_scsi_device; ++ ++ dummy_scsi_device.host = apidev_host; ++ ++ return (qla2x00_ioctl(&dummy_scsi_device, (int)cmd, (void*)arg)); ++} ++ ++#define driver_template qla2x00_driver_template ++#include "scsi_module.c" +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_os.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,156 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * Portions (C) Arjan van de Ven <arjanv@redhat.com> for Red Hat, Inc. ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++#ifndef __QLA_OS_H ++#define __QLA_OS_H ++ ++/* ++ * Driver debug definitions. ++ */ ++/* #define QL_DEBUG_LEVEL_1 */ /* Output register accesses to COM1 */ ++/* #define QL_DEBUG_LEVEL_2 */ /* Output error msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_3 */ /* Output function trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_4 */ /* Output NVRAM trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_5 */ /* Output ring trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_6 */ /* Output WATCHDOG timer trace to COM1 */ ++/* #define QL_DEBUG_LEVEL_7 */ /* Output RISC load trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_8 */ /* Output ring saturation msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_9 */ /* Output IOCTL trace msgs */ ++/* #define QL_DEBUG_LEVEL_10 */ /* Output IOCTL error msgs */ ++/* #define QL_DEBUG_LEVEL_11 */ /* Output Mbx Cmd trace msgs */ ++/* #define QL_DEBUG_LEVEL_12 */ /* Output IP trace msgs */ ++/* ++ * Local Macro Definitions. ++ */ ++#if defined(QL_DEBUG_LEVEL_1) || defined(QL_DEBUG_LEVEL_2) || \ ++ defined(QL_DEBUG_LEVEL_3) || defined(QL_DEBUG_LEVEL_4) || \ ++ defined(QL_DEBUG_LEVEL_5) || defined(QL_DEBUG_LEVEL_6) || \ ++ defined(QL_DEBUG_LEVEL_7) || defined(QL_DEBUG_LEVEL_8) || \ ++ defined(QL_DEBUG_LEVEL_9) || defined(QL_DEBUG_LEVEL_10) || \ ++ defined(QL_DEBUG_LEVEL_11) || defined(QL_DEBUG_LEVEL_12) ++ #define QL_DEBUG_ROUTINES ++#endif ++ ++#include <linux/config.h> ++#ifndef QLA_MODVERSION ++#define __NO_VERSION__ ++#endif ++#include <linux/module.h> ++#include <linux/version.h> ++#include <linux/init.h> ++#include <linux/string.h> ++#include <linux/errno.h> ++#include <linux/kernel.h> ++#include <linux/ioport.h> ++#include <linux/delay.h> ++#include <linux/timer.h> ++#include <linux/sched.h> ++#include <linux/pci.h> ++#include <linux/proc_fs.h> ++#include <linux/blk.h> ++#include <linux/interrupt.h> ++#include <linux/stat.h> ++#include <linux/slab.h> ++#define __KERNEL_SYSCALLS__ ++#include <linux/unistd.h> ++#include <linux/smp_lock.h> ++#include <linux/bio.h> ++#include <linux/moduleparam.h> ++ ++#include <asm/system.h> ++ ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/segment.h> ++#include <asm/byteorder.h> ++#include <asm/pgtable.h> ++ ++#include "scsi.h" ++#include "hosts.h" ++ ++#if defined(FC_IP_SUPPORT) ++#include <linux/ip.h> ++#include <linux/if_arp.h> ++#include <linux/skbuff.h> ++#endif ++ ++#include <linux/ioctl.h> ++#include <scsi/scsi_ioctl.h> ++#include <asm/uaccess.h> ++ ++//TODO Fix this!!! ++/* ++* String arrays ++*/ ++#define LINESIZE 256 ++#define MAXARGS 26 ++ ++/* PCI interface definitions */ ++struct qla_fw_info { ++ unsigned short addressing; /* addressing method used to load fw */ ++#define FW_INFO_ADDR_NORMAL 0 ++#define FW_INFO_ADDR_EXTENDED 1 ++#define FW_INFO_ADDR_NOMORE 0xffff ++ unsigned short *fwcode; /* pointer to FW array */ ++ unsigned short *fwlen; /* number of words in array */ ++ unsigned short *fwstart; /* start address for F/W */ ++ unsigned long *lfwstart; /* start address (long) for F/W */ ++}; ++struct qla_board_info { ++ char name[9]; /* Board ID String */ ++ struct qla_fw_info *fwinfo; ++}; ++ ++/*********************************************************************** ++* We use the Scsi_Pointer structure that's included with each command ++* SCSI_Cmnd as a scratchpad. ++* ++* SCp is defined as follows: ++* - SCp.ptr -- > pointer to the SRB ++* - SCp.this_residual -- > HBA completion status for ioctl code. ++* ++* Cmnd->host_scribble --> Used to hold the hba actived handle (1..255). ++***********************************************************************/ ++#define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr) ++#define CMD_COMPL_STATUS(Cmnd) ((Cmnd)->SCp.this_residual) ++#define CMD_HANDLE(Cmnd) ((Cmnd)->host_scribble) ++/* Additional fields used by ioctl passthru */ ++#define CMD_RESID_LEN(Cmnd) ((Cmnd)->SCp.buffers_residual) ++#define CMD_SCSI_STATUS(Cmnd) ((Cmnd)->SCp.Status) ++#define CMD_ACTUAL_SNSLEN(Cmnd) ((Cmnd)->SCp.Message) ++#define CMD_ENTRY_STATUS(Cmnd) ((Cmnd)->SCp.have_data_in) ++ ++/* ++ * Other SCS__Cmnd members we only reference ++ */ ++#define CMD_XFRLEN(Cmnd) (Cmnd)->request_bufflen ++#define CMD_CDBLEN(Cmnd) (Cmnd)->cmd_len ++#define CMD_CDBP(Cmnd) (Cmnd)->cmnd ++#define CMD_SNSP(Cmnd) (Cmnd)->sense_buffer ++#define CMD_SNSLEN(Cmnd) (sizeof (Cmnd)->sense_buffer) ++#define CMD_RESULT(Cmnd) ((Cmnd)->result) ++#define CMD_TIMEOUT(Cmnd) ((Cmnd)->timeout_per_command) ++ ++#define SCSI_BUS_32(scp) ((scp)->device->channel) ++#define SCSI_TCN_32(scp) ((scp)->device->id) ++#define SCSI_LUN_32(scp) ((scp)->device->lun) ++ ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_settings.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,80 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++/* ++ * Compile time Options: ++ * 0 - Disable and 1 - Enable ++ */ ++#define MEMORY_MAPPED_IO 0 ++#define STOP_ON_ERROR 0 /* Stop on aborts and resets */ ++#define STOP_ON_RESET 0 ++#define STOP_ON_ABORT 0 ++#define QLA_SCSI_VENDOR_DIR 0 /* Decode vendor specific opcodes for direction */ ++#define QLA2100_LIPTEST 0 ++#define REQ_TRACE 1 ++#define USE_ABORT_TGT 1 /* Use Abort Target mbx cmd */ ++ ++#define DEBUG_QLA2100 0 /* For Debug of qla2x00 */ ++ ++#define MPIO_SUPPORT 0 ++#define VSA 0 /* Volume Set Addressing */ ++ ++/* ++ * When a lun is suspended for the "Not Ready" condition ++ * then it will suspend the lun for increments of 6 sec delays. ++ * SUSPEND_COUNT is that count. ++ */ ++#define SUSPEND_COUNT 10 /* 6 secs * 10 retries = 60 secs */ ++ ++/* Failover options */ ++#define MAX_RECOVERYTIME 10 /* Max suspend time for a lun recovery time */ ++#define MAX_FAILBACKTIME 5 /* (60) Max suspend time before failing back */ ++ ++#define QLA_CMD_TIMER_DELTA 3 ++ ++#define MAX_RETRIES_OF_ISP_ABORT 5 /* */ ++ ++/* ++ * Defines the time in seconds that ++ * the driver extends the command timeout ++ * to get around the problem where the ++ * mid-layer only allows 5 retries for commands ++ * that return BUS_BUSY ++ */ ++#define EXTEND_CMD_TIMEOUT 60 ++ ++/* ++ * We need to hardcode this value since the firmware ++ * does not allow us to retrieve the maximum number of ++ * IOCBs available during initializtion. ++ * ++ * Factors that affect this value include the amount of ++ * memory on-board (HBA) and firmware IP support. ++ * ++ */ ++#undef IOCB_THROTTLE_USAGE ++#undef IOCB_HIT_RATE ++#define MAX_IOCBS_AVAILBALE 3000 ++ ++/* ++ * Some vendor subsystems do not recover properly after a device reset. Define ++ * the following to force a logout after a successful device reset. ++ */ ++#undef LOGOUT_AFTER_DEVICE_RESET ++ ++#include "qla_version.h" +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_sup.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,560 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++static uint16_t qla2x00_nvram_request(scsi_qla_host_t *, uint32_t); ++ ++static void qla2x00_flash_enable(scsi_qla_host_t *); ++static void qla2x00_flash_disable(scsi_qla_host_t *); ++ ++uint8_t qla2x00_read_flash_byte(scsi_qla_host_t *, uint32_t); ++static void qla2x00_write_flash_byte(scsi_qla_host_t *, uint32_t, uint8_t); ++static uint8_t qla2x00_poll_flash(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t poll_data, uint8_t mid); ++static uint8_t qla2x00_program_flash_address(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t data, uint8_t mid); ++static uint8_t qla2x00_erase_flash_sector(scsi_qla_host_t *ha, ++ uint32_t addr, uint32_t sec_mask, uint8_t mid); ++ ++uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha); ++uint16_t qla2x00_get_flash_version(scsi_qla_host_t *); ++uint16_t qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image); ++uint16_t qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image); ++ ++ ++/* ++ * NVRAM support routines ++ */ ++ ++/** ++ * qla2x00_get_nvram_word() - Calculates word position in NVRAM and calls the ++ * request routine to get the word from NVRAM. ++ * @ha: HA context ++ * @addr: Address in NVRAM to read ++ * ++ * Returns the word read from nvram @addr. ++ */ ++uint16_t ++qla2x00_get_nvram_word(scsi_qla_host_t *ha, uint32_t addr) ++{ ++ uint16_t data; ++ uint32_t nv_cmd; ++ ++ ENTER(__func__); ++ ++ nv_cmd = addr << 16; ++ nv_cmd |= NV_READ_OP; ++ data = qla2x00_nvram_request(ha, nv_cmd); ++ ++ DEBUG4(printk("%s(%ld): NVRAM[%lx]=%lx.\n", ++ __func__, ha->host_no, (u_long)addr, (u_long)data)); ++ ++ LEAVE(__func__); ++ ++ return (data); ++} ++ ++/** ++ * qla2x00_nvram_request() - Sends read command to NVRAM and gets data from ++ * NVRAM. ++ * @ha: HA context ++ * @nv_cmd: NVRAM command ++ * ++ * Bit definitions for NVRAM command: ++ * ++ * Bit 26 = start bit ++ * Bit 25, 24 = opcode ++ * Bit 23-16 = address ++ * Bit 15-0 = write data ++ * ++ * Returns the word read from nvram @addr. ++ */ ++static uint16_t ++qla2x00_nvram_request(scsi_qla_host_t *ha, uint32_t nv_cmd) ++{ ++ uint8_t cnt; ++ device_reg_t *reg = ha->iobase; ++ uint16_t data = 0; ++ uint16_t reg_data; ++ ++ /* Send command to NVRAM. */ ++ nv_cmd <<= 5; ++ for (cnt = 0; cnt < 11; cnt++) { ++ if (nv_cmd & BIT_31) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ else ++ qla2x00_nv_write(ha, 0); ++ nv_cmd <<= 1; ++ } ++ ++ /* Read data from NVRAM. */ ++ for (cnt = 0; cnt < 16; cnt++) { ++ WRT_REG_WORD(®->nvram, NVR_SELECT | NVR_CLOCK); ++ NVRAM_DELAY(); ++ data <<= 1; ++ reg_data = RD_REG_WORD(®->nvram); ++ if (reg_data & NVR_DATA_IN) ++ data |= BIT_0; ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ NVRAM_DELAY(); ++ } ++ ++ /* Deselect chip. */ ++ WRT_REG_WORD(®->nvram, NVR_DESELECT); ++ NVRAM_DELAY(); ++ ++ return (data); ++} ++ ++/** ++ * qla2x00_nv_write() - Clean NVRAM operations. ++ * @ha: HA context ++ */ ++void ++qla2x00_nv_deselect(scsi_qla_host_t *ha) ++{ ++ device_reg_t *reg = ha->iobase; ++ ++ WRT_REG_WORD(®->nvram, NVR_DESELECT); ++ NVRAM_DELAY(); ++} ++ ++/** ++ * qla2x00_nv_write() - Prepare for NVRAM read/write operation. ++ * @ha: HA context ++ * @data: Serial interface selector ++ */ ++void ++qla2x00_nv_write(scsi_qla_host_t *ha, uint16_t data) ++{ ++ device_reg_t *reg = ha->iobase; ++ ++ WRT_REG_WORD(®->nvram, data | NVR_SELECT); ++ NVRAM_DELAY(); ++ WRT_REG_WORD(®->nvram, data | NVR_SELECT | NVR_CLOCK); ++ NVRAM_DELAY(); ++ WRT_REG_WORD(®->nvram, data | NVR_SELECT); ++ NVRAM_DELAY(); ++} ++ ++/* ++ * Flash support routines ++ */ ++ ++/** ++ * qla2x00_flash_enable() - Setup flash for reading and writing. ++ * @ha: HA context ++ */ ++static void ++qla2x00_flash_enable(scsi_qla_host_t *ha) ++{ ++ uint16_t data; ++ device_reg_t *reg = ha->iobase; ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ data |= CSR_FLASH_ENABLE; ++ WRT_REG_WORD(®->ctrl_status, data); ++} ++ ++/** ++ * qla2x00_flash_disable() - Disable flash and allow RISC to run. ++ * @ha: HA context ++ */ ++static void ++qla2x00_flash_disable(scsi_qla_host_t *ha) ++{ ++ uint16_t data; ++ device_reg_t *reg = ha->iobase; ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ data &= ~(CSR_FLASH_ENABLE); ++ WRT_REG_WORD(®->ctrl_status, data); ++} ++ ++/** ++ * qla2x00_read_flash_byte() - Reads a byte from flash ++ * @ha: HA context ++ * @addr: Address in flash to read ++ * ++ * A word is read from the chip, but, only the lower byte is valid. ++ * ++ * Returns the byte read from flash @addr. ++ */ ++uint8_t ++qla2x00_read_flash_byte(scsi_qla_host_t *ha, uint32_t addr) ++{ ++ uint16_t data; ++ uint16_t bank_select; ++ device_reg_t *reg = ha->iobase; ++ ++ /* Setup bit 16 of flash address. */ ++ bank_select = RD_REG_WORD(®->ctrl_status); ++ if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { ++ bank_select |= CSR_FLASH_64K_BANK; ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } else if (((addr & BIT_16) == 0) && ++ (bank_select & CSR_FLASH_64K_BANK)) { ++ bank_select &= ~(CSR_FLASH_64K_BANK); ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } ++ WRT_REG_WORD(®->flash_address, (uint16_t)addr); ++ data = qla2x00_debounce_register(®->flash_data); ++ ++ return ((uint8_t)data); ++} ++ ++/** ++ * qla2x00_write_flash_byte() - Write a byte to flash ++ * @ha: HA context ++ * @addr: Address in flash to write ++ * @data: Data to write ++ */ ++static void ++qla2x00_write_flash_byte(scsi_qla_host_t *ha, uint32_t addr, uint8_t data) ++{ ++ uint16_t bank_select; ++ device_reg_t *reg = ha->iobase; ++ ++ /* Setup bit 16 of flash address. */ ++ bank_select = RD_REG_WORD(®->ctrl_status); ++ if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { ++ bank_select |= CSR_FLASH_64K_BANK; ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } else if (((addr & BIT_16) == 0) && ++ (bank_select & CSR_FLASH_64K_BANK)) { ++ bank_select &= ~(CSR_FLASH_64K_BANK); ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } ++ WRT_REG_WORD(®->flash_address, (uint16_t)addr); ++ WRT_REG_WORD(®->flash_data, (uint16_t)data); ++} ++ ++/** ++ * qla2x00_poll_flash() - Polls flash for completion. ++ * @ha: HA context ++ * @addr: Address in flash to poll ++ * @poll_data: Data to be polled ++ * @mid: Flash manufacturer ID ++ * ++ * This function polls the device until bit 7 of what is read matches data ++ * bit 7 or until data bit 5 becomes a 1. If that hapens, the flash ROM timed ++ * out (a fatal error). The flash book recommeds reading bit 7 again after ++ * reading bit 5 as a 1. ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++static uint8_t ++qla2x00_poll_flash(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t poll_data, uint8_t mid) ++{ ++ uint8_t status; ++ uint8_t flash_data; ++ uint32_t cnt; ++ int failed_pass; ++ ++ status = 1; ++ failed_pass = 1; ++ ++ /* Wait for 30 seconds for command to finish. */ ++ poll_data &= BIT_7; ++ for (cnt = 3000000; cnt; cnt--) { ++ flash_data = qla2x00_read_flash_byte(ha, addr); ++ if ((flash_data & BIT_7) == poll_data) { ++ status = 0; ++ break; ++ } ++ ++ if (mid != 0x40 && mid != 0xda) { ++ if (flash_data & BIT_5) ++ failed_pass--; ++ if (failed_pass < 0) ++ break; ++ } ++ udelay(10); ++ barrier(); ++ } ++ return (status); ++} ++ ++/** ++ * qla2x00_program_flash_address() - Programs a flash address ++ * @ha: HA context ++ * @addr: Address in flash to program ++ * @data: Data to be written in flash ++ * @mid: Flash manufacturer ID ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++static uint8_t ++qla2x00_program_flash_address(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t data, uint8_t mid) ++{ ++ /* Write Program Command Sequence */ ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ qla2x00_write_flash_byte(ha, 0x5555, 0xa0); ++ qla2x00_write_flash_byte(ha, addr, data); ++ ++ /* Wait for write to complete. */ ++ return (qla2x00_poll_flash(ha, addr, data, mid)); ++} ++ ++/** ++ * qla2x00_erase_flash_sector() - Erase a flash sector. ++ * @ha: HA context ++ * @addr: Flash sector to erase ++ * @sec_mask: Sector address mask ++ * @mid: Flash manufacturer ID ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++static uint8_t ++qla2x00_erase_flash_sector(scsi_qla_host_t *ha, ++ uint32_t addr, uint32_t sec_mask, uint8_t mid) ++{ ++ /* Individual Sector Erase Command Sequence */ ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ qla2x00_write_flash_byte(ha, 0x5555, 0x80); ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ ++ if (mid == 0xda) ++ qla2x00_write_flash_byte(ha, addr & sec_mask, 0x10); ++ else ++ qla2x00_write_flash_byte(ha, addr & sec_mask, 0x30); ++ ++ udelay(150); ++ ++ /* Wait for erase to complete. */ ++ return (qla2x00_poll_flash(ha, addr, 0x80, mid)); ++} ++ ++/** ++ * qla2x00_get_flash_manufacturer() - Read manufacturer ID from flash chip. ++ * @ha: HA context ++ * ++ * Returns the manufacturer's ID read from the flash chip. ++ */ ++uint8_t ++qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha) ++{ ++ uint8_t manuf_id; ++ ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ qla2x00_write_flash_byte(ha, 0x5555, 0x90); ++ manuf_id = qla2x00_read_flash_byte(ha, 0x0001); ++ ++ return (manuf_id); ++} ++ ++/** ++ * qla2x00_get_flash_version() - Read version information from flash. ++ * @ha: HA context ++ * ++ * Returns QL_STATUS_SUCCESS on successful retrieval of flash version. ++ */ ++uint16_t ++qla2x00_get_flash_version(scsi_qla_host_t *ha) ++{ ++ uint16_t ret = QL_STATUS_SUCCESS; ++ uint32_t loop_cnt = 1; /* this is for error exit only */ ++ uint32_t pcir_adr; ++ ++ ENTER(__func__); ++ ++ qla2x00_flash_enable(ha); ++ do { /* Loop once to provide quick error exit */ ++ /* Match signature */ ++ if (!(qla2x00_read_flash_byte(ha, 0) == 0x55 && ++ qla2x00_read_flash_byte(ha, 1) == 0xaa)) { ++ /* No signature */ ++ DEBUG2(printk("scsi(%ld): No matching FLASH " ++ "signature.\n", ha->host_no)); ++ ret = QL_STATUS_ERROR; ++ break; ++ } ++ ++ pcir_adr = qla2x00_read_flash_byte(ha, 0x18) & 0xff; ++ ++ /* validate signature of PCI data structure */ ++ if ((qla2x00_read_flash_byte(ha, pcir_adr)) == 'P' && ++ (qla2x00_read_flash_byte(ha, pcir_adr + 1)) == 'C' && ++ (qla2x00_read_flash_byte(ha, pcir_adr + 2)) == 'I' && ++ (qla2x00_read_flash_byte(ha, pcir_adr + 3)) == 'R') { ++ ++ /* Read version */ ++ ha->optrom_minor = ++ qla2x00_read_flash_byte(ha, pcir_adr + 0x12); ++ ha->optrom_major = ++ qla2x00_read_flash_byte(ha, pcir_adr + 0x13); ++ DEBUG3(printk("%s(): got %d.%d.\n", ++ __func__, ha->optrom_major, ha->optrom_minor)); ++ } else { ++ /* error */ ++ DEBUG2(printk("%s(): PCI data struct not found. " ++ "pcir_adr=%x.\n", ++ __func__, pcir_adr)); ++ ret = QL_STATUS_ERROR; ++ break; ++ } ++ ++ } while (--loop_cnt); ++ qla2x00_flash_disable(ha); ++ ++ LEAVE(__func__); ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_get_flash_image() - Read image from flash chip. ++ * @ha: HA context ++ * @image: Buffer to receive flash image ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++uint16_t ++qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image) ++{ ++ uint32_t addr; ++ uint32_t midpoint; ++ uint8_t *data; ++ device_reg_t *reg = ha->iobase; ++ ++ midpoint = FLASH_IMAGE_SIZE / 2; ++ ++ qla2x00_flash_enable(ha); ++ WRT_REG_WORD(®->nvram, 0); ++ for (addr = 0, data = image; addr < FLASH_IMAGE_SIZE; addr++, data++) { ++ if (addr == midpoint) ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ ++ *data = qla2x00_read_flash_byte(ha, addr); ++ } ++ qla2x00_flash_disable(ha); ++ ++ return (0); ++} ++ ++/** ++ * qla2x00_set_flash_image() - Write image to flash chip. ++ * @ha: HA context ++ * @image: Source image to write to flash ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++uint16_t ++qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image) ++{ ++ uint16_t status; ++ uint32_t addr; ++ uint32_t midpoint; ++ uint32_t sec_mask; ++ uint32_t rest_addr; ++ uint8_t mid; ++ uint8_t sec_number; ++ uint8_t data; ++ device_reg_t *reg = ha->iobase; ++ ++ status = 0; ++ sec_number = 0; ++ ++ /* Reset ISP chip. */ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ qla2x00_flash_enable(ha); ++ do { /* Loop once to provide quick error exit */ ++ /* Structure of flash memory based on manufacturer */ ++ mid = qla2x00_get_flash_manufacturer(ha); ++ if (mid == 0x6d) { ++ // Am29LV001 part ++ rest_addr = 0x1fff; ++ sec_mask = 0x1e000; ++ } ++ else if (mid == 0x40) { ++ // Mostel v29c51001 part ++ rest_addr = 0x1ff; ++ sec_mask = 0x1fe00; ++ } ++ else if (mid == 0xbf) { ++ // SST39sf10 part ++ rest_addr = 0xfff; ++ sec_mask = 0x1f000; ++ } ++ else if (mid == 0xda) { ++ // Winbond W29EE011 part ++ rest_addr = 0x7f; ++ sec_mask = 0x1ff80; ++ addr = 0; ++ if (qla2x00_erase_flash_sector(ha, ++ addr, sec_mask, mid)) { ++ status = 1; ++ break; ++ } ++ } ++ else { ++ // Am29F010 part ++ rest_addr = 0x3fff; ++ sec_mask = 0x1c000; ++ } ++ ++ midpoint = FLASH_IMAGE_SIZE / 2; ++ for (addr = 0; addr < FLASH_IMAGE_SIZE; addr++) { ++ data = *image++; ++ /* Are we at the beginning of a sector? */ ++ if (!(addr & rest_addr)) { ++ if (addr == midpoint) ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ ++ /* Then erase it */ ++ if (qla2x00_erase_flash_sector(ha, ++ addr, sec_mask, mid)) { ++ status = 1; ++ break; ++ } ++ ++ sec_number++; ++ } ++ if (mid == 0x6d) { ++ if (sec_number == 1 && ++ (addr == (rest_addr - 1))) { ++ rest_addr = 0x0fff; ++ sec_mask = 0x1f000; ++ } ++ else if (sec_number == 3 && (addr & 0x7ffe)) { ++ rest_addr = 0x3fff; ++ sec_mask = 0x1c000; ++ } ++ } ++ ++ if (qla2x00_program_flash_address(ha, ++ addr, data, mid)) { ++ status = 1; ++ break; ++ } ++ } ++ } while (0); ++ qla2x00_flash_disable(ha); ++ ++ return (status); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_vendor.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,193 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++/* ++ * vendor specific op codes. ++*/ ++#define UCSCSI_DCMD 0x20 /* vendor specific command */ ++#define DAC_CDB_LEN 12 ++#define DAC_SENSE_LEN 64 ++ ++#define DACMD_WRITE_CONF_ONDISK 0x4B ++#define DACMD_WRITE_CONFIG 0x06 ++#define DACMD_WRITE_CONF2 0x3C ++#define DACMD_WRITE_CONFLABEL 0x49 /* Write configuration label */ ++#define DACMD_WRITE_CONFIG_V3x 0x4F ++#define DACMD_ADD_CONFIG_V2x 0x18 ++#define DACMD_ADD_CONFIG_V3x 0x4C ++#define DACMD_STORE_IMAGE 0x21 ++#define DACMD_ADD_CAPACITY 0x2A /* add physical drives to existing array */ ++#define DACMD_WRITE_IOPORT 0x3A /* write port B */ ++#define DACMD_S2S_WRITEFULLCONF 0x60 /* write full configuration */ ++#define DACMD_S2S_ADDFULLCONF 0x62 /* add full configuration */ ++#define DACMD_S2S_WRITELUNMAP_OLD 0x58 /* write LUN map information */ ++#define DACMD_S2S_WRITELUNMAP 0xD2 /* Write LUN MAP Information */ ++#define DACMD_S2S_WRITE_IOPORT 0x66 /* write expanded IO port */ ++#define DACMD_WRITE_V3x 0x34 /* write data from plain memory */ ++#define DACMD_S2S_WRITESIG 0x4D /* write signature information */ ++ ++#if !defined(s08bits) ++#define s08bits char ++#define s16bits short ++#define s32bits int ++#define u08bits unsigned s08bits ++#define u16bits unsigned s16bits ++#define u32bits unsigned s32bits ++#endif ++ ++typedef struct dac_command ++{ ++ u08bits mb_Command; /* Mail Box register 0 */ ++ u08bits mb_CmdID; /* Mail Box register 1 */ ++ u08bits mb_ChannelNo; /* Mail Box register 2 */ ++ u08bits mb_TargetID; /* Mail Box register 3 */ ++ u08bits mb_DevState; /* Mail Box register 4 */ ++ u08bits mb_MailBox5; /* Mail Box register 5 */ ++ u08bits mb_MailBox6; /* Mail Box register 6 */ ++ u08bits mb_SysDevNo; /* Mail Box register 7 */ ++ u32bits mb_Datap; /* Mail Box register 8-B */ ++ u08bits mb_MailBoxC; /* Mail Box register C */ ++ u08bits mb_StatusID; /* Mail box register D */ ++ u16bits mb_Status; /* Mail Box Register E,F */ ++} ++dac_command_t; ++ ++typedef struct dac_scdb ++{ ++ u08bits db_ChannelTarget; /* ChannelNo 7..4 & Target 3..0 */ ++ u08bits db_DATRET; /* different bits, see below */ ++ u16bits db_TransferSize; /* Request/done size in bytes */ ++ u32bits db_PhysDatap; /* Physical addr in host memory */ ++ u08bits db_CdbLen; /* 6, 10 or 12 */ ++ u08bits db_SenseLen; /* If returned from DAC (<= 64) */ ++ u08bits db_Cdb[DAC_CDB_LEN]; /* The CDB itself */ ++ u08bits db_SenseData[DAC_SENSE_LEN];/* Result of request sense */ ++ u08bits db_StatusIn; /* SCSI status returned */ ++ u08bits db_Reserved1; ++} ++dac_scdb_t; ++ ++typedef struct dga_scdb ++{ ++ u08bits dsc_osreq[1024]; /* OS related buffer:sizeof(mdac_req_t) */ ++ ++ u08bits dsc_familyctlno; /* Controller number within family */ ++ u08bits dsc_ctlno; /* Controller number */ ++ u08bits dsc_chno; /* Channel number */ ++ u08bits dsc_tgt; /* target ID */ ++ ++ u08bits dsc_lun; /* Lun ID */ ++ u08bits dsc_rebuildflag; /* current rebuild flag */ ++ u16bits dsc_status; /* completion status */ ++ ++ u08bits dsc_scsiversion; /* SCSI protocol version */ ++ u08bits dsc_hostctlno; /* host system controller number */ ++ u16bits dsc_reqsenseseqno; /* request sense sequence number */ ++ ++ u32bits dsc_events; /* # events at start */ ++ ++ u32bits dsc_pollwaitchan; /* sleep/wakeup channel */ ++ u32bits dsc_poll; /* polling value, if =0 op complete */ ++ ++ struct dga_ctldev *dsc_ctp; /* pointer back to controller */ ++ void *dsc_pdp; /* pointer back to physical device */ ++ void *dsc_ldp; /* pointer back to logical device */ ++ void (*dsc_intr)(void); /* completion call back function */ ++ ++ /* all save functions are used in S2S */ ++ u08bits dsc_savedcdb[DAC_CDB_LEN];/* 12 bytes saved CDB from SCSI CDB */ ++ u32bits (*dsc_statsintr)(struct dga_scdb *); /* statistics completion function */ ++ ++ void (*dsc_savedintr)(void); /* completion call back function */ ++ void *dsc_savedctp; /* pointer back to controller */ ++ u08bits dsc_savedfamilyctlno; /* Controller number within family */ ++ u08bits dsc_savedctlno; /* Controller number */ ++ u08bits dsc_savedchno; /* Channel number */ ++ u08bits dsc_savedtgt; /* target ID */ ++ ++ u08bits dsc_savedlun; /* Lun ID */ ++ u08bits dsc_savedcdblen; /* saved CDB len for SCDB */ ++ u08bits dsc_scanmode; ++ u08bits dsc_pageno; /* pageno for data > 4K */ ++ u32bits dsc_residue; ++ u32bits dsc_Reserved4; ++ ++ dac_command_t dsc_dcmd; /* DCMD space, 16 bytes */ ++ dac_scdb_t dsc_scdb; /* SCDB space */ ++ u32bits dsc_EventSeqNo; ++ u32bits dsc_ReqSenseNo; ++ ++ u32bits dsc_Reserved64[16]; /* leave this for OLD SCO driver bug */ ++ ++ u08bits dsc_data[256]; /* Rest is data */ ++} ++dga_scdb_t; ++ ++/* ++* qla2100_set_scsi_direction ++* This routine will set the proper direction for vendor specific ++* commands. ++* ++* Note: Vendors should modify this routine to set the proper ++* direction of the transfer if they used vendor specific commands. ++* ++* Input: ++* ha = adapter block pointer. ++* sp = SCSI Request Block structure pointer. ++* ++* Returns: ++* 0 = success, was able to issue command. ++*/ ++void ++qla2x00_set_vend_direction(scsi_qla_host_t *ha, ++ Scsi_Cmnd *cmd, cmd_entry_t *pkt) ++{ ++ dga_scdb_t *dsp = (dga_scdb_t *) cmd; ++ ++ if (cmd->data_cmnd[0] == UCSCSI_DCMD) { ++ switch( dsp->dsc_dcmd.mb_Command ) { ++ case DACMD_WRITE_CONF_ONDISK: ++ case DACMD_WRITE_CONFIG: ++ case DACMD_WRITE_CONF2: ++ case DACMD_WRITE_CONFLABEL: ++ case DACMD_WRITE_CONFIG_V3x: ++ case DACMD_ADD_CONFIG_V2x: ++ case DACMD_ADD_CONFIG_V3x: ++ case DACMD_STORE_IMAGE: ++ case DACMD_ADD_CAPACITY: ++ case DACMD_WRITE_IOPORT: ++ case DACMD_S2S_WRITEFULLCONF: ++ case DACMD_S2S_ADDFULLCONF: ++ case DACMD_S2S_WRITELUNMAP_OLD: ++ case DACMD_S2S_WRITELUNMAP: ++ case DACMD_S2S_WRITE_IOPORT: ++ case DACMD_WRITE_V3x: ++ case DACMD_S2S_WRITESIG: ++ pkt->control_flags |= BIT_6; ++ break; ++ default: ++ pkt->control_flags |= BIT_5; ++ } ++ } else ++ pkt->control_flags |= BIT_5; ++} ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_version.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,31 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++/* ++ * Driver version ++ */ ++#if DEBUG_QLA2100 ++#define QLA2100_VERSION "8.00.00b1-debug" ++#else ++#define QLA2100_VERSION "8.00.00b1" ++#endif ++ ++#define QLA_DRIVER_MAJOR_VER 8 ++#define QLA_DRIVER_MINOR_VER 0 ++#define QLA_DRIVER_PATCH_VER 0 ++#define QLA_DRIVER_BETA_VER 1 +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_xioct.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,6589 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * 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. ++ * ++ ******************************************************************************/ ++ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "inioct.h" ++ ++ ++#define QLA_PT_CMD_TOV (60) /* firmware timeout */ ++#define QLA_PT_CMD_DRV_TOV (QLA_PT_CMD_TOV + 1) /* drvr timeout */ ++#define QLA_IOCTL_ACCESS_WAIT_TIME (QLA_PT_CMD_DRV_TOV + 2) /* wait_q tov */ ++#define QLA_INITIAL_IOCTLMEM_SIZE (2 * PAGE_SIZE) ++#define QLA_IOCTL_SCRAP_SIZE 2048 /* scrap memory for local use. */ ++ ++/* ELS related defines */ ++#define FC_HEADER_LEN 24 ++#define ELS_RJT_LENGTH 0x08 /* 8 */ ++#define ELS_RPS_ACC_LENGTH 0x40 /* 64 */ ++#define ELS_RLS_ACC_LENGTH 0x1C /* 28 */ ++ ++/* ELS cmd Reply Codes */ ++#define ELS_STAT_LS_RJT 0x01 ++#define ELS_STAT_LS_ACC 0x02 ++ ++#define IOCTL_INVALID_STATUS 0xffff ++ ++ ++int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *); ++void qla2x00_free_ioctl_mem(scsi_qla_host_t *); ++ ++int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t); ++void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *); ++ ++/* ++ * Local prototypes ++ */ ++static int qla2x00_get_new_ioctl_dma_mem(scsi_qla_host_t *, uint32_t); ++ ++#if defined(ISP2300) ++static uint8_t qla2x00_get_next_free_pub_id(scsi_qla_host_t *, uint16_t *); ++static uint8_t qla2x00_host_relogin(scsi_qla_host_t *, fcdev_t *); ++#endif ++ ++static int qla2x00_find_curr_ha(uint16_t, scsi_qla_host_t **); ++ ++static int qla2x00_get_driver_specifics(EXT_IOCTL *); ++ ++static int qla2x00_aen_reg(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_aen_get(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static int qla2x00_query(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_hba_node(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_hba_port(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_disc_port(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_disc_tgt(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_chip(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static int qla2x00_get_data(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_statistics(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_fc_statistics(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_port_summary(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_driver(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_fw(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++#if defined(ISP2300) ++static int qla2x00_send_els_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++#endif ++static int qla2x00_send_fcct(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_start_ms_cmd(scsi_qla_host_t *, EXT_IOCTL *, srb_t *, ++ EXT_ELS_PT_REQ *); ++ ++static int qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_sc_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_sc_fc_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_sc_scsi3_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static int qla2x00_send_els_rnid(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_rnid_params(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_set_host_data(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_set_rnid_params(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static void qla2x00_waitq_sem_timeout(unsigned long); ++static uint8_t qla2x00_get_ioctl_access(scsi_qla_host_t *, uint32_t); ++static uint8_t qla2x00_release_ioctl_access(scsi_qla_host_t *); ++ ++static void qla2x00_wait_q_memb_alloc(scsi_qla_host_t *, wait_q_t **); ++static void qla2x00_wait_q_memb_free(scsi_qla_host_t *, wait_q_t *); ++static uint8_t qla2x00_wait_q_add(scsi_qla_host_t *, wait_q_t **); ++static void qla2x00_wait_q_get_next(scsi_qla_host_t *, wait_q_t **); ++static void qla2x00_wait_q_remove(scsi_qla_host_t *, wait_q_t *); ++ ++ ++/* ++ * qla2x00_ioctl_sleep_done ++ * ++ * Description: ++ * This is the callback function to wakeup ioctl completion semaphore ++ * for the ioctl request that is waiting. ++ * ++ * Input: ++ * sem - pointer to the ioctl completion semaphore. ++ * ++ * Returns: ++ */ ++static void ++qla2x00_ioctl_sleep_done(struct semaphore * sem) ++{ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (sem != NULL){ ++ DEBUG9(printk("ioctl_sleep: wake up sem.\n");) ++ up(sem); ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++} ++ ++/* ++ * qla2x00_ioctl_sem_init ++ * ++ * Description: ++ * Initialize the ioctl timer and semaphore used to wait for passthru ++ * completion. ++ * ++ * Input: ++ * ha - pointer to scsi_qla_host_t structure used for initialization. ++ * ++ * Returns: ++ * None. ++ */ ++static void ++qla2x00_ioctl_sem_init(scsi_qla_host_t *ha) ++{ ++ init_MUTEX_LOCKED(&ha->ioctl->cmpl_sem); ++ init_timer(&(ha->ioctl->cmpl_timer)); ++ ha->ioctl->cmpl_timer.data = (unsigned long)&ha->ioctl->cmpl_sem; ++ ha->ioctl->cmpl_timer.function = ++ (void (*)(unsigned long))qla2x00_ioctl_sleep_done; ++} ++ ++/* ++ * qla2x00_scsi_pt_done ++ * ++ * Description: ++ * Resets ioctl progress flag and wakes up the ioctl completion semaphore. ++ * ++ * Input: ++ * pscsi_cmd - pointer to the passthru Scsi cmd structure which has completed. ++ * ++ * Returns: ++ */ ++static void ++qla2x00_scsi_pt_done(Scsi_Cmnd *pscsi_cmd) ++{ ++ struct Scsi_Host *host; ++ scsi_qla_host_t *ha; ++ ++ host = pscsi_cmd->device->host; ++ ha = (scsi_qla_host_t *) host->hostdata; ++ ++ DEBUG9(printk("%s post function called OK\n", __func__);) ++ ++ /* save detail status for IOCTL reporting */ ++ ha->ioctl->SCSIPT_InProgress = 0; ++ ha->ioctl->ioctl_tov = 0; ++ ++ up(&ha->ioctl->cmpl_sem); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return; ++} ++ ++/* ++ * qla2x00_msiocb_done ++ * ++ * Description: ++ * Resets MSIOCB ioctl progress flag and wakes up the ioctl completion ++ * semaphore. ++ * ++ * Input: ++ * cmd - pointer to the passthru Scsi cmd structure which has completed. ++ * ++ * Returns: ++ */ ++static void ++qla2x00_msiocb_done(Scsi_Cmnd *pscsi_cmd) ++{ ++ struct Scsi_Host *host; ++ scsi_qla_host_t *ha; ++ ++ host = pscsi_cmd->device->host; ++ ha = (scsi_qla_host_t *) host->hostdata; ++ ++ DEBUG9(printk("%s post function called OK\n", __func__);) ++ ++ ha->ioctl->MSIOCB_InProgress = 0; ++ ha->ioctl->ioctl_tov = 0; ++ ++ up(&ha->ioctl->cmpl_sem); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return; ++} ++ ++/************************************************************************* ++ * qla2x00_ioctl ++ * ++ * Description: ++ * Performs additional ioctl requests not satisfied by the upper levels. ++ * ++ * Returns: ++ * ret = 0 Success ++ * ret != 0 Failed; detailed status copied to EXT_IOCTL structure ++ * if possible ++ *************************************************************************/ ++int ++qla2x00_ioctl(Scsi_Device *dev, int cmd, void *arg) ++{ ++ int mode = 0; ++ int tmp_rval = 0; ++ int ret = -EINVAL; ++ ++ uint8_t *temp; ++ uint8_t tempbuf[8]; ++ uint32_t i; ++ uint32_t status; ++ ++ EXT_IOCTL *pext; ++ ++ scsi_qla_host_t *ha; ++ ++ ++ DEBUG9(printk("%s: entry to command (%x), arg (%p)\n", ++ __func__, cmd, arg);) ++ ++ /* Catch any non-exioct ioctls */ ++ if (_IOC_TYPE(cmd) != QLMULTIPATH_MAGIC) { ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)arg, sizeof(EXT_IOCTL)); ++ if (ret) { ++ DEBUG9_10(printk("%s: ERROR VERIFY_READ EXT_IOCTL " ++ "sturct. cmd=%d arg=%p.\n", __func__, cmd, arg);) ++ return (ret); ++ } ++ ++ /* Allocate ioctl structure buffer to support multiple concurrent ++ * entries. ++ */ ++ pext = KMEM_ZALLOC(sizeof(EXT_IOCTL), 16); ++ if (pext == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "qla2x00: ERROR in main ioctl buffer allocation.\n"); ++ return (-ENOMEM); ++ } ++ ++ /* copy in application layer EXT_IOCTL */ ++ ret = copy_from_user(pext, arg, sizeof(EXT_IOCTL)); ++ if (ret) { ++ DEBUG9_10(printk("%s: ERROR COPY_FROM_USER " ++ "EXT_IOCTL sturct. cmd=%d arg=%p.\n", ++ __func__, cmd, arg);) ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ } ++ ++ /* Verify before update status fields in EXT_IOCTL struct. */ ++ ret = verify_area(VERIFY_WRITE, (void *)arg, sizeof(EXT_IOCTL)); ++ if (ret) { ++ DEBUG9_10(printk("%s: ERROR VERIFY_WRITE EXT_IOCTL " ++ "sturct. cmd=%d arg=%p.\n", __func__, cmd, arg);) ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ } ++ ++ /* check signature of this ioctl */ ++ temp = (uint8_t *) &pext->Signature; ++ ++ for (i = 0; i < 4; i++, temp++) ++ tempbuf[i] = *temp; ++ ++ if ((tempbuf[0] == 'Q') && (tempbuf[1] == 'L') && ++ (tempbuf[2] == 'O') && (tempbuf[3] == 'G')) ++ status = 0; ++ else ++ status = 1; ++ ++ if (status != 0) { ++ DEBUG9_10(printk("%s: signature did not match. " ++ "cmd=%d arg=%p.\n", __func__, cmd, arg);) ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ /* check version of this ioctl */ ++ if (pext->Version > EXT_VERSION) { ++ printk(KERN_WARNING ++ "qla2x00: ioctl interface version not supported = %d.\n", ++ pext->Version); ++ pext->Status = EXT_STATUS_UNSUPPORTED_VERSION; ++ copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ /* check for special cmds used during application's setup time. */ ++ switch (cmd) { ++ case EXT_CC_STARTIOCTL: ++ DEBUG9(printk("%s: got startioctl command.\n", __func__);) ++ ++ pext->Instance = num_hosts; ++ pext->Status = EXT_STATUS_OK; ++ ret = copy_to_user((void *)arg, (void *)pext, ++ sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ ++ case EXT_CC_SETINSTANCE: ++ /* This call is used to return the HBA's host number to ++ * ioctl caller. All subsequent ioctl commands will put ++ * the host number in HbaSelect field to tell us which ++ * HBA is the destination. ++ */ ++ if (pext->Instance < num_hosts) { ++ if (!((uint32_t)pext->VendorSpecificData & ++ EXT_DEF_USE_HBASELECT)) { ++ /* Backward compatible code. */ ++ apiHBAInstance = pext->Instance; ++ } ++ ++ /* ++ * Return host number via pext->HbaSelect for ++ * specified API instance number. ++ */ ++ if (qla2x00_find_curr_ha(pext->Instance, &ha) != 0) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ DEBUG9_10(printk("%s: SETINSTANCE invalid inst " ++ "%d. num_hosts=%d ha=%p ret=%d.\n", ++ __func__, pext->Instance, num_hosts, ha, ++ ret);) ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); /* ioctl completed ok */ ++ } ++ ++ pext->HbaSelect = ha->host_no; ++ pext->Status = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s: Matching instance %d to hba " ++ "%ld.\n", __func__, pext->Instance, ha->host_no);) ++ } else { ++ DEBUG9_10(printk("%s: ERROR EXT_SETINSTANCE." ++ " Instance=%d num_hosts=%d ha=%p.\n", ++ __func__, pext->Instance, num_hosts, ha);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ } ++ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ ++ DEBUG9(printk("%s: SETINSTANCE exiting. ret=%d.\n", ++ __func__, ret);) ++ ++ return (ret); ++ ++ case EXT_CC_DRIVER_SPECIFIC: ++ ret = qla2x00_get_driver_specifics(pext); ++ tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ if (ret == 0) ++ ret = tmp_rval; ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ ++ default: ++ break; ++ } ++ ++ if (!((uint32_t)pext->VendorSpecificData & EXT_DEF_USE_HBASELECT)) { ++ /* Backward compatible code. */ ++ /* Will phase out soon. */ ++ ++ /* Check for valid apiHBAInstance (set previously by ++ * EXT_SETINSTANCE or default 0) and set ha context ++ * for this IOCTL. ++ */ ++ if (qla2x00_find_curr_ha(apiHBAInstance, &ha) != 0) { ++ ++ DEBUG9_10(printk("%s: ERROR matching apiHBAInstance " ++ "%d to an HBA Instance.\n", ++ __func__, pext->HbaSelect);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ DEBUG9(printk("%s: active apiHBAInstance=%d host_no=%ld " ++ "CC=%x SC=%x.\n", ++ __func__, apiHBAInstance, ha->host_no, cmd, pext->SubCode);) ++ ++ } else { ++ /* Use HbaSelect value to get a matching ha instance ++ * for this ioctl command. ++ */ ++ if (qla2x00_find_curr_ha(pext->HbaSelect, &ha) != 0) { ++ ++ DEBUG9_10(printk("%s: ERROR matching pext->HbaSelect " ++ "%d to an HBA Instance.\n", ++ __func__, pext->HbaSelect);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ DEBUG9(printk("%s: active host_inst=%ld CC=%x SC=%x.\n", ++ __func__, ha->instance, cmd, pext->SubCode);) ++ } ++ ++ /* ++ * Get permission to process ioctl command. Only one will proceed ++ * at a time. ++ */ ++ if (qla2x00_get_ioctl_access(ha, QLA_IOCTL_ACCESS_WAIT_TIME) != 0) { ++ /* error timed out */ ++ DEBUG9_10(printk("%s: ERROR timeout getting ioctl " ++ "access. host no=%d.\n", __func__, pext->HbaSelect);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EBUSY); ++ } ++ ++ ++ while (test_bit(CFG_ACTIVE, &ha->cfg_flags) || ha->dpc_active) { ++ if( signal_pending(current) ) ++ break; /* get out */ ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ); ++ } ++ ++ switch (cmd) { /* switch on EXT IOCTL COMMAND CODE */ ++ ++ case EXT_CC_QUERY: ++ DEBUG9(printk("%s: got query command.\n", __func__);) ++ ++ ret = qla2x00_query(ha, pext, 0); ++ ++ break; ++ ++ case EXT_CC_GET_DATA: ++ DEBUG9(printk("%s: got get_data command.\n", __func__);) ++ ++ ret = qla2x00_get_data(ha, pext, 0); ++ ++ break; ++ ++ case EXT_CC_SEND_FCCT_PASSTHRU: ++ DEBUG9(printk("%s: got CT passthru cmd.\n", __func__)); ++ ++ ret = qla2x00_send_fcct(ha, pext, 0); ++ ++ break; ++ ++ case EXT_CC_SEND_SCSI_PASSTHRU: ++ DEBUG9(printk("%s: got SCSI passthru cmd.\n", __func__)); ++ ++ ret = qla2x00_scsi_passthru(ha, pext, mode); ++ ++ break; ++ ++ case EXT_CC_REG_AEN: ++ ret = qla2x00_aen_reg(ha, pext, mode); ++ ++ break; ++ ++ case EXT_CC_GET_AEN: ++ ret = qla2x00_aen_get(ha, pext, mode); ++ ++ break; ++ ++ case EXT_CC_WWPN_TO_SCSIADDR: ++ ret = qla2x00_wwpn_to_scsiaddr(ha, pext, 0); ++ break; ++ ++ case EXT_CC_SEND_ELS_RNID: ++ ret = qla2x00_send_els_rnid(ha, pext, mode); ++ break; ++ ++ case EXT_CC_SET_DATA: ++ ret = qla2x00_set_host_data(ha, pext, mode); ++ break; ++ ++ case INT_CC_READ_NVRAM: ++ ret = qla2x00_read_nvram(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_UPDATE_NVRAM: ++ ret = qla2x00_update_nvram(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_LOOPBACK: ++ ret = qla2x00_send_loopback(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_READ_OPTION_ROM: ++ ret = qla2x00_read_option_rom(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_UPDATE_OPTION_ROM: ++ ret = qla2x00_update_option_rom(ha, pext, mode); ++ ++ break; ++ ++#if defined(ISP2300) ++ case EXT_CC_SEND_ELS_PASSTHRU: ++ DEBUG9(printk("%s: got ELS passthru cmd.\n", __func__)); ++ ++ ret = qla2x00_send_els_passthru(ha, pext, 0); ++ ++ break; ++#endif ++ ++ /* all others go here */ ++ /* ++ case EXT_CC_PLATFORM_REG: ++ break; ++ */ ++ ++ /* Failover IOCTLs */ ++ case FO_CC_GET_PARAMS: ++ case FO_CC_SET_PARAMS: ++ case FO_CC_GET_PATHS: ++ case FO_CC_SET_CURRENT_PATH: ++ case FO_CC_RESET_HBA_STAT: ++ case FO_CC_GET_HBA_STAT: ++ case FO_CC_GET_LUN_DATA: ++ case FO_CC_SET_LUN_DATA: ++ case FO_CC_GET_TARGET_DATA: ++ case FO_CC_SET_TARGET_DATA: ++ DEBUG9(printk("%s: failover arg (%p):\n", __func__, arg);) ++ ++ qla2x00_fo_ioctl(ha, cmd, pext, mode); ++ ++ break; ++ ++ default: ++ pext->Status = EXT_STATUS_INVALID_REQUEST; ++ break; ++ ++ } /* end of CC decode switch */ ++ ++ /* Always try to copy values back regardless what happened before. */ ++ tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ if (ret == 0) ++ ret = tmp_rval; ++ ++ DEBUG9(printk("%s: exiting. tmp_rval(%d) ret(%d)\n", ++ __func__, tmp_rval, ret);) ++ ++ qla2x00_release_ioctl_access(ha); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++} ++ ++/* ++ * qla2x00_alloc_ioctl_mem ++ * Allocates memory needed by IOCTL code. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_alloc_ioctl_mem(scsi_qla_host_t *ha) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_new_ioctl_dma_mem(ha, QLA_INITIAL_IOCTLMEM_SIZE) != ++ QL_STATUS_SUCCESS) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl physical memory allocation\n"); ++ ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ /* Allocate context memory buffer */ ++ ha->ioctl = KMEM_ZALLOC(sizeof(hba_ioctl_context), 11); ++ if (ha->ioctl == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl context allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ /* Allocate AEN tracking buffer */ ++ ha->ioctl->aen_tracking_queue = ++ KMEM_ZALLOC(EXT_DEF_MAX_AEN_QUEUE * sizeof(EXT_ASYNC_EVENT), 12); ++ if (ha->ioctl->aen_tracking_queue == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl aen_queue allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ ha->ioctl->ioctl_tq = KMEM_ZALLOC(sizeof(os_tgt_t), 13); ++ if (ha->ioctl->ioctl_tq == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl tgt queue allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ ha->ioctl->ioctl_lq = KMEM_ZALLOC(sizeof(os_lun_t), 14); ++ if (ha->ioctl->ioctl_lq == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl lun queue allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ /*INIT_LIST_HEAD(&(ha->ioctl->ioctl_lq->cmd));*/ ++ ++ /* Pick the largest size we'll need per ha of all ioctl cmds. ++ * Use this size when freeing. ++ */ ++ ha->ioctl->scrap_mem = KMEM_ZALLOC(QLA_IOCTL_SCRAP_SIZE, 15); ++ if (ha->ioctl->scrap_mem == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl scrap_mem allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ha->ioctl->scrap_mem_size = QLA_IOCTL_SCRAP_SIZE; ++ ha->ioctl->scrap_mem_used = 0; ++ DEBUG9(printk("%s(%ld): scrap_mem_size=%d.\n", ++ __func__, ha->host_no, ha->ioctl->scrap_mem_size);) ++ ++ ha->ioctl->ioctl_lq->q_state = LUN_STATE_READY; ++ ha->ioctl->ioctl_lq->q_lock = SPIN_LOCK_UNLOCKED; ++ ++ /* Init wait_q fields */ ++ ha->ioctl->wait_q_lock = SPIN_LOCK_UNLOCKED; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_get_new_ioctl_dma_mem ++ * Allocates dma memory of the specified size. ++ * This is done to replace any previously allocated ioctl dma buffer. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_new_ioctl_dma_mem(scsi_qla_host_t *ha, uint32_t size) ++{ ++ DEBUG9(printk("%s entered.\n", __func__);) ++ ++ if (ha->ioctl_mem) { ++ DEBUG9(printk("%s: ioctl_mem was previously allocated. " ++ "Dealloc old buffer.\n", __func__);) ++ ++ /* free the memory first */ ++ pci_free_consistent(ha->pdev, ha->ioctl_mem_size, ha->ioctl_mem, ++ ha->ioctl_mem_phys); ++ } ++ ++ /* Get consistent memory allocated for ioctl I/O operations. */ ++ ha->ioctl_mem = pci_alloc_consistent(ha->pdev, ++ size, &ha->ioctl_mem_phys); ++ ++ if (ha->ioctl_mem == NULL) { ++ printk(KERN_WARNING ++ "%s: ERROR in ioctl physical memory allocation. " ++ "Requested length=%x.\n", __func__, size); ++ ++ ha->ioctl_mem_size = 0; ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ha->ioctl_mem_size = size; ++ ++ DEBUG9(printk("%s exiting.\n", __func__);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_free_ioctl_mem ++ * Frees memory used by IOCTL code for the specified ha. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_free_ioctl_mem(scsi_qla_host_t *ha) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (ha->ioctl != NULL) { ++ ++ if (ha->ioctl->scrap_mem != NULL) { ++ /* The size here must match up to what we ++ * allocated before. ++ */ ++ KMEM_FREE(ha->ioctl->scrap_mem, ++ ha->ioctl->scrap_mem_size); ++ ha->ioctl->scrap_mem = NULL; ++ ha->ioctl->scrap_mem_size = 0; ++ } ++ ++ if (ha->ioctl->ioctl_tq != NULL) { ++ KMEM_FREE(ha->ioctl->ioctl_tq, sizeof(os_tgt_t)); ++ ha->ioctl->ioctl_tq = NULL; ++ } ++ ++ if (ha->ioctl->ioctl_lq != NULL) { ++ KMEM_FREE(ha->ioctl->ioctl_lq, sizeof(os_lun_t)); ++ ha->ioctl->ioctl_lq = NULL; ++ } ++ ++ if (ha->ioctl->aen_tracking_queue != NULL) { ++ KMEM_FREE(ha->ioctl->aen_tracking_queue, ++ EXT_DEF_MAX_AEN_QUEUE * sizeof(EXT_ASYNC_EVENT)); ++ ha->ioctl->aen_tracking_queue = NULL; ++ } ++ ++ KMEM_FREE(ha->ioctl, sizeof(hba_ioctl_context)); ++ ha->ioctl = NULL; ++ } ++ ++ /* free memory allocated for ioctl operations */ ++ pci_free_consistent(ha->pdev, ha->ioctl_mem_size, ha->ioctl_mem, ++ ha->ioctl_mem_phys); ++ ha->ioctl_mem = NULL; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++} ++ ++/* ++ * qla2x00_get_ioctl_scrap_mem ++ * Returns pointer to memory of the specified size from the scrap buffer. ++ * This can be called multiple times before the free call as long ++ * as the memory is to be used by the same ioctl command and ++ * there's still memory left in the scrap buffer. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ppmem = pointer to return a buffer pointer. ++ * size = size of buffer to return. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *ha, void **ppmem, uint32_t size) ++{ ++ int ret = QL_STATUS_SUCCESS; ++ uint32_t free_mem; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered. size=%d.\n", ++ __func__, ha->host_no, ha->instance, size);) ++ ++ free_mem = ha->ioctl->scrap_mem_size - ha->ioctl->scrap_mem_used; ++ if (free_mem >= size) { ++ *ppmem = ha->ioctl->scrap_mem + ha->ioctl->scrap_mem_used; ++ ha->ioctl->scrap_mem_used += size; ++ } else { ++ DEBUG10(printk("%s(%ld): no more scrap memory.\n", ++ __func__, ha->host_no);) ++ ++ ret = QL_STATUS_ERROR; ++ } ++ ++ DEBUG9(printk("%s(%ld): exiting. ret=%d.\n", ++ __func__, ha->host_no, ret);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_free_ioctl_scrap_mem ++ * Makes the entire scrap buffer free for use. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ */ ++void ++qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *ha) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ memset(ha->ioctl->scrap_mem, 0, ha->ioctl->scrap_mem_size); ++ ha->ioctl->scrap_mem_used = 0; ++ ++ DEBUG9(printk("%s(%ld): exiting.\n", ++ __func__, ha->host_no);) ++} ++ ++#if defined(ISP2300) ++/* ++ * qla2x00_get_next_free_pub_id ++ * Find the next free public loop ID to use, starting from the old ++ * loop ID passed in. If the old loop ID is invalid, this function ++ * will start the search from beginning. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ploop_id = pointer to a 16bit var containing the old loop ++ * ID which is also to be used to get the new loop ID. ++ * ++ * Returns: ++ * QL_STATUS_SUCCESS - Found an usable loop ID ++ * QL_STATUS_RESOURCE_ERROR - No more free loop ID ++ */ ++static uint8_t ++qla2x00_get_next_free_pub_id(scsi_qla_host_t *ha, uint16_t *ploop_id) ++{ ++ uint8_t retval = QL_STATUS_SUCCESS; ++ uint16_t index; ++ uint16_t old_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ old_id = *ploop_id; ++ if (old_id >= LAST_SNS_LOOP_ID) { ++ /* set a starting point */ ++ old_id = ha->min_external_loopid; ++ } ++ ++ for (index = old_id; index < LAST_SNS_LOOP_ID; index++) { ++ if (!ha->fabricid[index].in_use) { ++ ha->fabricid[index].in_use = TRUE; ++ *ploop_id = index; ++ DEBUG9(printk("%s(%ld): found Lid %02x.\n", ++ __func__, ha->host_no, index);) ++ break; ++ } ++ } ++ if (index >= LAST_SNS_LOOP_ID) { ++ /* no more free ID */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no more free LID " ++ "available.\n", __func__, ha->host_no, ha->instance);) ++ ++ retval = QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting. retval=%d.\n", ++ __func__, ha->host_no, ha->instance, retval);) ++ ++ return retval; ++} ++ ++/* ++ * qla2x00_host_relogin ++ * Issue fabric login command to a host in the host_db which ++ * had somehow been lost before. All updates are passed back ++ * via pdevice. No update will be done to any of ha's database. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * pdevice = pointer to FC device type structure. ++ * ++ * Returns: ++ * QL_STATUS_SUCCESS - Login successfully ++ * QL_STATUS_ERROR - Login failed ++ * QL_STATUS_FATAL_ERROR - Fatal error ++ */ ++static uint8_t ++qla2x00_host_relogin(scsi_qla_host_t *ha, fcdev_t *pdevice) ++{ ++ uint8_t retval = QL_STATUS_SUCCESS; ++ uint16_t status[3]; ++ uint16_t tmp_loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* pdevice->loop_id is assumed to be straight from the current ++ * database content. ++ */ ++ tmp_loop_id = pdevice->loop_id & 0xff; ++ if (tmp_loop_id >= LAST_SNS_LOOP_ID) { ++ /* Invalid value. We need to find a valid ID to use. */ ++ if (qla2x00_get_next_free_pub_id(ha, &tmp_loop_id) != 0) { ++ /* no more free IDs to use */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld no free loop_id " ++ " available for login.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_ERROR; ++ } ++ } ++ ++ for (;;) { ++ DEBUG9(printk("%s(%ld): Login w/loop id 0x%02x for port " ++ "%02x%02x%02x\n", ++ __func__, ha->host_no, pdevice->loop_id, ++ pdevice->d_id.b.domain, ++ pdevice->d_id.b.area, ++ pdevice->d_id.b.al_pa)); ++ ++ /* Login device on switch. */ ++ qla2x00_login_fabric(ha, ++ tmp_loop_id, pdevice->d_id.b.domain, ++ pdevice->d_id.b.area, pdevice->d_id.b.al_pa, ++ &status[0], 0); ++ ++ if (status[0] != MBS_CMD_CMP && ++ status[0] != MBS_PORT_ID_IN_USE && ++ status[0] != MBS_LOOP_ID_IN_USE) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld " ++ "ERROR login status[0]=%x status[1]=%x.\n", ++ __func__, ha->host_no, ha->instance, status[0], ++ status[1]);) ++ ++ retval = QL_STATUS_FATAL_ERROR; ++ break; ++ } ++ ++ if (status[0] == MBS_CMD_CMP) { ++ DEBUG9(printk("%s(%ld): inst=%ld " ++ " host login success; loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, tmp_loop_id);) ++ ++ pdevice->loop_id = tmp_loop_id; ++ retval = QL_STATUS_SUCCESS; ++ break; ++ ++ } else if (status[0] == MBS_PORT_ID_IN_USE) { ++ ha->fabricid[tmp_loop_id].in_use = FALSE; ++ tmp_loop_id = status[1]; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld " ++ "port %02x%02x%02x already using loop id=0x%02x in " ++ "f/w database. Retrying.\n", ++ __func__, ha->host_no, ha->instance, ++ pdevice->d_id.b.domain, ++ pdevice->d_id.b.area, ++ pdevice->d_id.b.al_pa, ++ tmp_loop_id);) ++ ++ if (tmp_loop_id <= LAST_SNS_LOOP_ID) { ++ ha->fabricid[tmp_loop_id].in_use = TRUE; ++ } else { ++ /* Error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld " ++ "PORT_ID_IN_USE - invalid loop id %02x " ++ "returned.\n", ++ __func__, ha->host_no, ha->instance, ++ pdevice->loop_id);) ++ retval = QL_STATUS_ERROR; ++ break; ++ } ++ ++ } else if (status[0] == MBS_LOOP_ID_IN_USE) { ++ /* loop id already used by others; try another one */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld " ++ "loop id %02x already used.\n", ++ __func__, ha->host_no, ha->instance, ++ pdevice->loop_id);) ++ ++ /* Search for another usable loop_id */ ++ if (qla2x00_get_next_free_pub_id(ha, ++ &tmp_loop_id) == 0) { ++ ++ DEBUG9(printk("%s(%ld): previous loop " ++ "id in use. Retry with 0x%02x.\n", ++ __func__, ha->host_no, tmp_loop_id);) ++ ++ ha->fabricid[tmp_loop_id].in_use = TRUE; ++ } else { ++ /* Error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop id " ++ "in use; no more free loop id.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ retval = QL_STATUS_ERROR; ++ break; ++ } ++ } ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting. retval=%d.\n", ++ __func__, ha->host_no, ha->instance, retval);) ++ ++ return (retval); ++} ++#endif ++ ++/* ++ * qla2x00_find_curr_ha ++ * Searches and returns the pointer to the adapter host_no specified. ++ * ++ * Input: ++ * host_inst = driver internal adapter instance number to search. ++ * ha = adapter state pointer of the instance requested. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_find_curr_ha(uint16_t host_inst, scsi_qla_host_t **ret_ha) ++{ ++ int rval = QL_STATUS_SUCCESS; ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *search_ha = NULL; ++ ++ /* ++ * Set ha context for this IOCTL by matching host_no. ++ */ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ search_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (search_ha->instance == host_inst) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (!found) { ++ DEBUG10(printk("%s: ERROR matching host_inst " ++ "%d to an HBA Instance.\n", __func__, host_inst);) ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG9(printk("%s: found matching host_inst " ++ "%d to an HBA Instance.\n", __func__, host_inst);) ++ *ret_ha = search_ha; ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_driver_specifics ++ * Returns driver specific data in the response buffer. ++ * ++ * Input: ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_driver_specifics(EXT_IOCTL *pext) ++{ ++ int ret = 0; ++ EXT_LN_DRIVER_DATA data; ++ ++ DEBUG9(printk("%s: entered.\n", ++ __func__);) ++ ++ if (pext->ResponseLen < sizeof(EXT_LN_DRIVER_DATA)) { ++ pext->Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ DEBUG9_10(printk("%s: ERROR ResponseLen too small.\n", ++ __func__);) ++ ++ return (ret); ++ } ++ ++ data.DrvVer.Major = QLA_DRIVER_MAJOR_VER; ++ data.DrvVer.Minor = QLA_DRIVER_MINOR_VER; ++ data.DrvVer.Patch = QLA_DRIVER_PATCH_VER; ++ data.DrvVer.Beta = QLA_DRIVER_BETA_VER; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_LN_DRIVER_DATA)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR verify write resp buf\n", ++ __func__);) ++ ++ return (ret); ++ } ++ ++ ret = copy_to_user(pext->ResponseAdr, &data, sizeof(EXT_LN_DRIVER_DATA)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR copy resp buf\n", ++ __func__);) ++ } ++ ++ DEBUG9(printk("%s: exiting. ret=%d.\n", ++ __func__, ret);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_aen_reg ++ * IOCTL management server Asynchronous Event Tracking Enable/Disable. ++ * ++ * Input: ++ * ha = pointer to the adapter struct of the adapter to register. ++ * cmd = pointer to EXT_IOCTL structure containing values from user. ++ * mode = flags. not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_aen_reg(scsi_qla_host_t *ha, EXT_IOCTL *cmd, int mode) ++{ ++ int rval = 0; ++ EXT_REG_AEN reg_struct; ++ ++ DEBUG9(printk("%s(%ld): inst %ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ rval = verify_area(VERIFY_READ, (void *)cmd->RequestAdr, ++ sizeof(EXT_REG_AEN)); ++ if (rval) { ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst %ld ERROR verify read req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (rval); ++ } ++ ++ rval = copy_from_user(®_struct, cmd->RequestAdr, sizeof(EXT_REG_AEN)); ++ if (rval == 0) { ++ cmd->Status = EXT_STATUS_OK; ++ if (reg_struct.Enable) { ++ ha->ioctl->flags |= IOCTL_AEN_TRACKING_ENABLE; ++ } else { ++ ha->ioctl->flags &= ~IOCTL_AEN_TRACKING_ENABLE; ++ } ++ } else { ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst %ld reg_struct.Enable(%d) " ++ "ha->ioctl_flag(%x) cmd->Status(%d).", ++ __func__, ha->host_no, ha->instance, reg_struct.Enable, ++ ha->ioctl->flags, cmd->Status);) ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_aen_get ++ * Asynchronous Event Record Transfer to user. ++ * The entire queue will be emptied and transferred back. ++ * ++ * Input: ++ * ha = pointer to the adapter struct of the specified adapter. ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * mode = flags. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ * ++ * NOTE: Need to use hardware lock to protect the queues from updates ++ * via isr/enqueue_aen after we get rid of io_request_lock. ++ */ ++static int ++qla2x00_aen_get(scsi_qla_host_t *ha, EXT_IOCTL *cmd, int mode) ++{ ++ int rval = 0; ++ EXT_ASYNC_EVENT *tmp_q; ++ EXT_ASYNC_EVENT *paen; ++ uint8_t i; ++ uint8_t queue_cnt; ++ uint8_t request_cnt; ++ uint32_t stat = EXT_STATUS_OK; ++ uint32_t ret_len = 0; ++ unsigned long cpu_flags = 0; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ request_cnt = (uint8_t)(cmd->ResponseLen / sizeof(EXT_ASYNC_EVENT)); ++ ++ if (request_cnt < EXT_DEF_MAX_AEN_QUEUE) { ++ /* We require caller to alloc for the maximum request count */ ++ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ DEBUG9_10(printk("%s(%ld): inst=%ld Buffer too small. " ++ "Exiting normally.", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (rval); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&paen, ++ sizeof(EXT_ASYNC_EVENT) * EXT_DEF_MAX_AEN_QUEUE)) { ++ /* not enough memory */ ++ cmd->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_ASYNC_EVENT)*EXT_DEF_MAX_AEN_QUEUE);) ++ return (rval); ++ } ++ ++ /* 1st: Make a local copy of the entire queue content. */ ++ tmp_q = (EXT_ASYNC_EVENT *)ha->ioctl->aen_tracking_queue; ++ queue_cnt = 0; ++ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ i = ha->ioctl->aen_q_head; ++ ++ for (; queue_cnt < EXT_DEF_MAX_AEN_QUEUE;) { ++ if (tmp_q[i].AsyncEventCode != 0) { ++ memcpy(&paen[queue_cnt], &tmp_q[i], ++ sizeof(EXT_ASYNC_EVENT)); ++ queue_cnt++; ++ tmp_q[i].AsyncEventCode = 0; /* empty out the slot */ ++ } ++ ++ if (i == ha->ioctl->aen_q_tail) { ++ /* done. */ ++ break; ++ } ++ ++ i++; ++ ++ if (i == EXT_DEF_MAX_AEN_QUEUE) { ++ i = 0; ++ } ++ } ++ ++ /* Empty the queue. */ ++ ha->ioctl->aen_q_head = 0; ++ ha->ioctl->aen_q_tail = 0; ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ /* 2nd: Now transfer the queue content to user buffer */ ++ /* Copy the entire queue to user's buffer. */ ++ ret_len = (uint32_t)(queue_cnt * sizeof(EXT_ASYNC_EVENT)); ++ if (queue_cnt != 0) { ++ rval = verify_area(VERIFY_WRITE, (void *)cmd->ResponseAdr, ++ ret_len); ++ if (rval != 0) { ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify write resp buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (rval); ++ } ++ ++ rval = copy_to_user(cmd->ResponseAdr, paen, ret_len); ++ } ++ cmd->ResponseLen = ret_len; ++ ++ if (rval != 0) { ++ stat = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld FAILED. error = %d\n", ++ __func__, ha->host_no, ha->instance, stat);) ++ } else { ++ stat = EXT_STATUS_OK; ++ } ++ ++ cmd->Status = stat; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting. rval=%d.\n", ++ __func__, ha->host_no, ha->instance, rval);) ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_enqueue_aen ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * event_code = async event code of the event to add to queue. ++ * payload = event payload for the queue. ++ * ++ * Context: ++ * Interrupt context. ++ * NOTE: Need to hold the hardware lock to protect the queues from ++ * aen_get after we get rid of the io_request_lock. ++ */ ++void ++qla2x00_enqueue_aen(scsi_qla_host_t *ha, uint16_t event_code, void *payload) ++{ ++ uint8_t new_entry; /* index to current entry */ ++ uint16_t *mbx; ++ EXT_ASYNC_EVENT *aen_queue; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ aen_queue = (EXT_ASYNC_EVENT *)ha->ioctl->aen_tracking_queue; ++ if (aen_queue[ha->ioctl->aen_q_tail].AsyncEventCode != 0) { ++ /* Need to change queue pointers to make room. */ ++ ++ /* Increment tail for adding new entry. */ ++ ha->ioctl->aen_q_tail++; ++ if (ha->ioctl->aen_q_tail == EXT_DEF_MAX_AEN_QUEUE) { ++ ha->ioctl->aen_q_tail = 0; ++ } ++ ++ if (ha->ioctl->aen_q_head == ha->ioctl->aen_q_tail) { ++ /* ++ * We're overwriting the oldest entry, so need to ++ * update the head pointer. ++ */ ++ ha->ioctl->aen_q_head++; ++ if (ha->ioctl->aen_q_head == EXT_DEF_MAX_AEN_QUEUE) { ++ ha->ioctl->aen_q_head = 0; ++ } ++ } ++ } ++ ++ DEBUG(printk("%s(%ld): inst=%ld Adding code 0x%x to aen_q %p @ %d\n", ++ __func__, ha->host_no, ha->instance, event_code, aen_queue, ++ ha->ioctl->aen_q_tail);) ++ ++ new_entry = ha->ioctl->aen_q_tail; ++ aen_queue[new_entry].AsyncEventCode = event_code; ++ ++ /* Update payload */ ++ switch (event_code) { ++ case MBA_LIP_OCCURRED: ++ case MBA_LOOP_UP: ++ case MBA_LOOP_DOWN: ++ case MBA_LIP_RESET: ++ case MBA_PORT_UPDATE: ++ /* empty */ ++ break; ++ ++ case MBA_SCR_UPDATE: ++ mbx = (uint16_t *)payload; ++ /* al_pa */ ++ aen_queue[new_entry].Payload.RSCN.RSCNInfo[0] = LSB(mbx[2]); ++ /* area */ ++ aen_queue[new_entry].Payload.RSCN.RSCNInfo[1] = MSB(mbx[2]); ++ /* domain */ ++ aen_queue[new_entry].Payload.RSCN.RSCNInfo[2] = LSB(mbx[1]); ++ /* save in big endian */ ++ BIG_ENDIAN_24(aen_queue[new_entry].Payload.RSCN.RSCNInfo[0]); ++ ++ aen_queue[new_entry].Payload.RSCN.AddrFormat = MSB(mbx[1]); ++ ++ break; ++ ++ default: ++ /* Not supported */ ++ aen_queue[new_entry].AsyncEventCode = 0; ++ break; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++} ++ ++/* ++ * qla2x00_query ++ * Handles all subcommands of the EXT_CC_QUERY command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int rval = 0; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* All Query type ioctls are done here */ ++ switch(pext->SubCode) { ++ ++ case EXT_SC_QUERY_HBA_NODE: ++ /* fill in HBA NODE Information */ ++ rval = qla2x00_query_hba_node(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_HBA_PORT: ++ /* return HBA PORT related info */ ++ rval = qla2x00_query_hba_port(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DISC_PORT: ++ /* return discovered port information */ ++ rval = qla2x00_query_disc_port(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DISC_TGT: ++ /* return discovered target information */ ++ rval = qla2x00_query_disc_tgt(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_CHIP: ++ rval = qla2x00_query_chip(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DISC_LUN: ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ ++ default: ++ DEBUG9_10(printk("%s(%ld): inst=%ld unknown SubCode %d.\n", ++ __func__, ha->host_no, ha->instance, pext->SubCode);) ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ return rval; ++} ++ ++/* ++ * qla2x00_query_hba_node ++ * Handles EXT_SC_QUERY_HBA_NODE subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_hba_node(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t i, transfer_size; ++ EXT_HBA_NODE *ptmp_hba_node; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_hba_node, ++ sizeof(EXT_HBA_NODE))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_NODE));) ++ return (ret); ++ } ++ ++ /* fill all available HBA NODE Information */ ++ for (i = 0; i < 8 ; i++) ++ ptmp_hba_node->WWNN[i] = ha->node_name[i]; ++ ++ sprintf((char *)(ptmp_hba_node->Manufacturer),"Qlogic Corp."); ++ sprintf((char *)(ptmp_hba_node->Model), ha->brd_info->name); ++ ++ ptmp_hba_node->SerialNum[0] = ha->serial0; ++ ptmp_hba_node->SerialNum[1] = ha->serial1; ++ ptmp_hba_node->SerialNum[2] = ha->serial2; ++ sprintf((char *)(ptmp_hba_node->DriverVersion), qla2x00_version_str); ++ sprintf((char *)(ptmp_hba_node->FWVersion),"%2d.%02d.%02d", ++ ha->fw_major_version, ++ ha->fw_minor_version, ++ ha->fw_subminor_version); ++ ++ sprintf((char *)(ptmp_hba_node->OptRomVersion),"%d.%d", ++ ha->optrom_major, ha->optrom_minor); ++ ++ ptmp_hba_node->InterfaceType = EXT_DEF_FC_INTF_TYPE; ++ ptmp_hba_node->PortCount = 1; ++ ++ ++ ptmp_hba_node->DriverAttr = (ha->flags.failover_enabled) ? ++ DRVR_FO_ENABLED : 0; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_HBA_NODE)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the HBA_NODE to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_NODE)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_NODE); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_hba_node, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_hba_port ++ * Handles EXT_SC_QUERY_HBA_PORT subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_hba_port(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t tgt_cnt, tgt, transfer_size; ++ uint32_t port_cnt; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ EXT_HBA_PORT *ptmp_hba_port; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_hba_port, ++ sizeof(EXT_HBA_PORT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_PORT));) ++ return (ret); ++ } ++ ++ /* reflect all HBA PORT related info */ ++ ptmp_hba_port->WWPN[7] = ha->init_cb->port_name[7]; ++ ptmp_hba_port->WWPN[6] = ha->init_cb->port_name[6]; ++ ptmp_hba_port->WWPN[5] = ha->init_cb->port_name[5]; ++ ptmp_hba_port->WWPN[4] = ha->init_cb->port_name[4]; ++ ptmp_hba_port->WWPN[3] = ha->init_cb->port_name[3]; ++ ptmp_hba_port->WWPN[2] = ha->init_cb->port_name[2]; ++ ptmp_hba_port->WWPN[1] = ha->init_cb->port_name[1]; ++ ptmp_hba_port->WWPN[0] = ha->init_cb->port_name[0]; ++ ptmp_hba_port->Id[0] = 0; ++ ptmp_hba_port->Id[1] = ha->d_id.r.d_id[2]; ++ ptmp_hba_port->Id[2] = ha->d_id.r.d_id[1]; ++ ptmp_hba_port->Id[3] = ha->d_id.r.d_id[0]; ++ ptmp_hba_port->Type = EXT_DEF_INITIATOR_DEV; ++ ++ switch (ha->current_topology) { ++ case ISP_CFG_NL: ++ case ISP_CFG_FL: ++ ptmp_hba_port->Mode = EXT_DEF_LOOP_MODE; ++ break; ++ ++ case ISP_CFG_N: ++ case ISP_CFG_F: ++ ptmp_hba_port->Mode = EXT_DEF_P2P_MODE; ++ break; ++ ++ default: ++ ptmp_hba_port->Mode = EXT_DEF_UNKNOWN_MODE; ++ break; ++ } ++ ++ port_cnt = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* if removed or missing */ ++ if (atomic_read(&fcport->state) != FC_ONLINE) { ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld port %02x%02x%02x not online\n", ++ __func__, ha->host_no, ha->instance, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa)); ++ continue; ++ } ++ port_cnt++; ++ } ++ ++ tgt_cnt = 0; ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if (ha->otgt[tgt] == NULL) { ++ continue; ++ } ++ tgt_cnt++; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld disc_port cnt=%d, tgt cnt=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ port_cnt, tgt_cnt);) ++ ptmp_hba_port->DiscPortCount = port_cnt; ++ ptmp_hba_port->DiscTargetCount = tgt_cnt; ++ ++ if (ha->loop_state == LOOP_DOWN) { ++ ++ ptmp_hba_port->State = EXT_DEF_HBA_LOOP_DOWN; ++ ++ } else if (ha->loop_state != LOOP_READY || ++ test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ABORTS_ACTIVE) { ++ ++ ptmp_hba_port->State = EXT_DEF_HBA_SUSPENDED; ++ ++ } else { ++ ++ ptmp_hba_port->State = EXT_DEF_HBA_OK; ++ ++ } ++ ++ ptmp_hba_port->DiscPortNameType = EXT_DEF_USE_PORT_NAME; ++ ++ /* Return supported FC4 type depending on driver support. */ ++ ptmp_hba_port->PortSupportedFC4Types = EXT_DEF_FC4_TYPE_SCSI; ++#if defined(FC_IP_SUPPORT) ++ ++ ptmp_hba_port->PortSupportedFC4Types |= EXT_DEF_FC4_TYPE_IP; ++#endif ++#if defined(FC_SCTP_SUPPORT) ++ ++ ptmp_hba_port->PortSupportedFC4Types |= EXT_DEF_FC4_TYPE_SCTP; ++#endif ++ ++ ptmp_hba_port->PortActiveFC4Types = ha->active_fc4_types; ++ ++ /* Return supported speed depending on adapter type */ ++#if defined(ISP2100) ++ ++ ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT; ++#elif defined(ISP2200) ++ ++ ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT; ++#elif defined(ISP2300) ++ ++ ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT; ++#else ++ /* invalid */ ++ ptmp_hba_port->PortSupportedSpeed = 0; ++#endif ++ ++ ptmp_hba_port->PortSpeed = ha->current_speed; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ sizeof(EXT_HBA_PORT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the HBA_PORT to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_PORT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_PORT); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_hba_port, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return ret; ++} ++ ++/* ++ * qla2x00_query_disc_port ++ * Handles EXT_SC_QUERY_DISC_PORT subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_disc_port(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int found; ++ uint32_t tgt, transfer_size, inst; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_tgt_t *tq; ++ EXT_DISC_PORT *ptmp_disc_port; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered. Port inst=%02d.\n", ++ __func__, ha->host_no, ha->instance, pext->Instance);) ++ ++ inst = 0; ++ found = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (atomic_read(&fcport->state) != FC_ONLINE) { ++ /* port does not exist anymore */ ++ DEBUG9(printk("%s(%ld): fcport marked lost. " ++ "d_id=%02x%02x%02x loop_id=%02x not online.\n", ++ __func__, ha->host_no, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa, ++ fcport->loop_id);) ++ ++ continue; ++ } ++ ++ if (inst != pext->Instance) { ++ DEBUG9(printk("%s(%ld): found fcport %02d " ++ "d_id=%02x%02x%02x. Skipping.\n", ++ __func__, ha->host_no, inst, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa)); ++ ++ inst++; ++ continue; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found matching fcport %02d " ++ "online. d_id=%02x%02x%02x loop_id=%02x online.\n", ++ __func__, ha->host_no, ha->instance, inst, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa, ++ fcport->loop_id);) ++ ++ /* Found the matching port still connected. */ ++ found++; ++ break; ++ } ++ ++ if (!found) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld dev not found.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_disc_port, ++ sizeof(EXT_DISC_PORT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DISC_PORT));) ++ return (ret); ++ } ++ ++ memcpy(ptmp_disc_port->WWNN, fcport->node_name, WWN_SIZE); ++ memcpy(ptmp_disc_port->WWPN, fcport->port_name, WWN_SIZE); ++ ++ ptmp_disc_port->Id[0] = 0; ++ ptmp_disc_port->Id[1] = fcport->d_id.r.d_id[2]; ++ ptmp_disc_port->Id[2] = fcport->d_id.r.d_id[1]; ++ ptmp_disc_port->Id[3] = fcport->d_id.r.d_id[0]; ++ ++ /* Currently all devices on fcport list are target capable devices */ ++ /* This default value may need to be changed after we add non target ++ * devices also to this list. ++ */ ++ ptmp_disc_port->Type = EXT_DEF_TARGET_DEV; ++ ++ if (fcport->flags & FC_FABRIC_DEVICE) { ++ ptmp_disc_port->Type |= EXT_DEF_FABRIC_DEV; ++ } ++ if (fcport->flags & FC_TAPE_DEVICE) { ++ ptmp_disc_port->Type |= EXT_DEF_TAPE_DEV; ++ } ++ if (fcport->flags & FC_INITIATOR_DEVICE) { ++ ptmp_disc_port->Type |= EXT_DEF_INITIATOR_DEV; ++ } ++ ++ ptmp_disc_port->LoopID = fcport->loop_id; ++ ptmp_disc_port->Status = 0; ++ ptmp_disc_port->Bus = 0; ++ ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if ((tq = ha->otgt[tgt]) == NULL) { ++ continue; ++ } ++ ++ if (tq->vis_port == NULL) /* dg 08/14/01 */ ++ continue; ++ ++ if (memcmp(fcport->port_name, tq->vis_port->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ptmp_disc_port->TargetId = tgt; ++ break; ++ } ++ } ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ sizeof(EXT_DISC_PORT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the DISC_PORT to user */ ++ if (pext->ResponseLen < sizeof(EXT_DISC_PORT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_DISC_PORT); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_disc_port, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_disc_tgt ++ * Handles EXT_SC_QUERY_DISC_TGT subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_disc_tgt(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t tgt, transfer_size, inst; ++ uint32_t cnt, i; ++ fc_port_t *tgt_fcport; ++ os_tgt_t *tq; ++ EXT_DISC_TARGET *ptmp_disc_target; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ tq = NULL; ++ for (tgt = 0, inst = 0; tgt < MAX_TARGETS; tgt++) { ++ if (ha->otgt[tgt] == NULL) { ++ continue; ++ } ++ /* if wrong target id then skip to next entry */ ++ if (inst != pext->Instance) { ++ inst++; ++ continue; ++ } ++ tq = ha->otgt[tgt]; ++ break; ++ } ++ ++ if (tq == NULL || tgt == MAX_TARGETS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. " ++ "tq=%p, tgt=%d.\n", ++ __func__, ha->host_no, ha->instance, tq, tgt);) ++ return (ret); ++ } ++ ++ if (tq->vis_port == NULL) { /* dg 08/14/01 */ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. " ++ "tq=%p.\n", ++ __func__, ha->host_no, ha->instance, tq);) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_disc_target, ++ sizeof(EXT_DISC_TARGET))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DISC_TARGET));) ++ return (ret); ++ } ++ ++ tgt_fcport = tq->vis_port; ++ memcpy(ptmp_disc_target->WWNN, tgt_fcport->node_name, WWN_SIZE); ++ memcpy(ptmp_disc_target->WWPN, tgt_fcport->port_name, WWN_SIZE); ++ ++ ptmp_disc_target->Id[0] = 0; ++ ptmp_disc_target->Id[1] = tgt_fcport->d_id.r.d_id[2]; ++ ptmp_disc_target->Id[2] = tgt_fcport->d_id.r.d_id[1]; ++ ptmp_disc_target->Id[3] = tgt_fcport->d_id.r.d_id[0]; ++ ++ /* All devices on ha->otgt list are target capable devices. */ ++ ptmp_disc_target->Type = EXT_DEF_TARGET_DEV; ++ ++ if (tgt_fcport->flags & FC_FABRIC_DEVICE) { ++ ptmp_disc_target->Type |= EXT_DEF_FABRIC_DEV; ++ } ++ if (tgt_fcport->flags & FC_TAPE_DEVICE) { ++ ptmp_disc_target->Type |= EXT_DEF_TAPE_DEV; ++ } ++ if (tgt_fcport->flags & FC_INITIATOR_DEVICE) { ++ ptmp_disc_target->Type |= EXT_DEF_INITIATOR_DEV; ++ } ++ ++ ptmp_disc_target->LoopID = tgt_fcport->loop_id; ++ ptmp_disc_target->Status = 0; ++ ptmp_disc_target->Bus = 0; ++ ptmp_disc_target->TargetId = tgt; ++ ++ cnt = 0; ++ /* enumerate available LUNs under this TGT (if any) */ ++ if (ha->otgt[tgt] != NULL) { ++ for (i = 0; i < MAX_LUNS ; i++) { ++ if ((ha->otgt[tgt])->olun[i] !=0) ++ cnt++; ++ } ++ } ++ ++ ptmp_disc_target->LunCount = cnt; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_DISC_TARGET)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the DISC_PORT to user */ ++ if (pext->ResponseLen < sizeof(EXT_DISC_PORT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_DISC_TARGET); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_disc_target, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_chip ++ * Handles EXT_SC_QUERY_CHIP subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_chip(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t transfer_size, i; ++ EXT_CHIP *ptmp_isp; ++ struct Scsi_Host *host; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_isp, ++ sizeof(EXT_CHIP))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_CHIP));) ++ return (ret); ++ } ++ ++ host = ha->host; ++ ptmp_isp->VendorId = ha->pdev->vendor; ++ ptmp_isp->DeviceId = ha->pdev->device; ++ ptmp_isp->SubVendorId = ha->pdev->subsystem_vendor; ++ ptmp_isp->SubSystemId = ha->pdev->subsystem_device; ++ ptmp_isp->PciBusNumber = ha->pdev->bus->number; ++ ptmp_isp->PciDevFunc = ha->pdev->devfn; ++ ptmp_isp->PciSlotNumber = PCI_SLOT(ha->pdev->devfn); ++ ptmp_isp->IoAddr = host->io_port; ++ ptmp_isp->IoAddrLen = 512; ++ ptmp_isp->MemAddr = 0; /* ? */ ++ ptmp_isp->MemAddrLen = 0; /* ? */ ++ ptmp_isp->ChipType = 0; /* ? */ ++ ptmp_isp->InterruptLevel = host->irq; ++ ++ for (i = 0; i < 8; i++) ++ ptmp_isp->OutMbx[i] = 0; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_CHIP)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the ISP to user */ ++ if (pext->ResponseLen < sizeof(EXT_CHIP)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_CHIP); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, (uint8_t *)ptmp_isp, ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_data ++ * Handles all subcommands of the EXT_CC_GET_DATA command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_data(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int tmp_rval = 0; ++ ++ switch(pext->SubCode) { ++ case EXT_SC_GET_STATISTICS: ++ tmp_rval = qla2x00_get_statistics(ha, pext, mode); ++ break; ++ ++ case EXT_SC_GET_FC_STATISTICS: ++ tmp_rval = qla2x00_get_fc_statistics(ha, pext, mode); ++ break; ++ ++ case EXT_SC_GET_PORT_SUMMARY: ++ tmp_rval = qla2x00_get_port_summary(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DRIVER: ++ tmp_rval = qla2x00_query_driver(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_FW: ++ tmp_rval = qla2x00_query_fw(ha, pext, mode); ++ break; ++ ++ case EXT_SC_GET_RNID: ++ tmp_rval = qla2x00_get_rnid_params(ha, pext, mode); ++ break; ++ ++ default: ++ DEBUG10(printk("%s(%ld): inst=%ld unknown SubCode %d.\n", ++ __func__, ha->host_no, ha->instance, pext->SubCode);) ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ } ++ ++ return (tmp_rval); ++} ++ ++/* ++ * qla2x00_get_statistics ++ * Issues get_link_status mbx cmd and returns statistics ++ * relavent to the specified adapter. ++ * ++ * Input: ++ * ha = pointer to adapter struct of the specified adapter. ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_statistics(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ EXT_HBA_PORT_STAT *ptmp_stat; ++ int ret = 0; ++ link_stat_t stat_buf; ++ uint8_t rval; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint16_t mb_stat[1]; ++ uint32_t transfer_size; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_HBA_PORT_STAT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY_WRITE " ++ "EXT_HBA_PORT_STAT.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ /* Send mailbox cmd to get more. */ ++ if ((rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf, ++ mb_stat)) != QL_STATUS_SUCCESS) { ++ ++ if (rval == BIT_0) { ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ } else if (rval == BIT_1) { ++ pext->Status = EXT_STATUS_MAILBOX; ++ pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO; ++ } else { ++ pext->Status = EXT_STATUS_ERR; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR mailbox failed. " ++ "mb[0]=%x.\n", ++ __func__, ha->host_no, ha->instance, mb_stat[0]);) ++ printk(KERN_WARNING ++ "%s(%ld): inst=%ld ERROR mailbox failed. mb[0]=%x.\n", ++ __func__, ha->host_no, ha->instance, mb_stat[0]); ++ ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_stat, ++ sizeof(EXT_HBA_PORT_STAT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_PORT_STAT));) ++ return (ret); ++ } ++ ++ ptmp_stat->ControllerErrorCount = ha->total_isp_aborts; ++ ptmp_stat->DeviceErrorCount = ha->total_dev_errs; ++ ptmp_stat->TotalIoCount = ha->total_ios; ++ ptmp_stat->TotalMBytes = ha->total_bytes >> 20; ++ ptmp_stat->TotalLipResets = ha->total_lip_cnt; ++ /* ++ ptmp_stat->TotalInterrupts = ha->total_isr_cnt; ++ */ ++ ++ ptmp_stat->TotalLinkFailures = stat_buf.link_fail_cnt; ++ ptmp_stat->TotalLossOfSync = stat_buf.loss_sync_cnt; ++ ptmp_stat->TotalLossOfSignals = stat_buf.loss_sig_cnt; ++ ptmp_stat->PrimitiveSeqProtocolErrorCount = stat_buf.prim_seq_err_cnt; ++ ptmp_stat->InvalidTransmissionWordCount = stat_buf.inval_xmit_word_cnt; ++ ptmp_stat->InvalidCRCCount = stat_buf.inval_crc_cnt; ++ ++ /* now copy up the STATISTICS to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_PORT_STAT); ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ptmp_stat; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_fc_statistics ++ * Issues get_link_status mbx cmd to the target device with ++ * the specified WWN and returns statistics relavent to the ++ * device. ++ * ++ * Input: ++ * ha = pointer to adapter struct of the specified device. ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_fc_statistics(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ EXT_HBA_PORT_STAT *ptmp_stat; ++ EXT_DEST_ADDR addr_struct; ++ int ret = 0; ++ link_stat_t stat_buf; ++ uint8_t rval, tgt; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint8_t *req_name; ++ uint16_t mb_stat[1]; ++ uint32_t transfer_size; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_HBA_PORT_STAT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY_WRITE.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ ret = copy_from_user(&addr_struct, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy req buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ /* find the device's loop_id */ ++ switch (addr_struct.DestType) { ++ case EXT_DEF_DESTTYPE_WWPN: ++ req_name = addr_struct.DestAddr.WWPN; ++ for (tgt = 0; tgt < MAX_FIBRE_DEVICES; tgt++) { ++ if (memcmp(ha->fc_db[tgt].wwn, req_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ break; ++ } ++ } ++ break; ++ ++ case EXT_DEF_DESTTYPE_WWNN: ++ case EXT_DEF_DESTTYPE_PORTID: ++ case EXT_DEF_DESTTYPE_FABRIC: ++ case EXT_DEF_DESTTYPE_SCSI: ++ default: ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR Unsupported subcode " ++ "address type.\n", __func__, ha->host_no, ha->instance);) ++ return (ret); ++ ++ break; ++ } ++ ++ if (tgt == MAX_FIBRE_DEVICES) { ++ /* not found */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ pext->DetailStatus = EXT_DSTATUS_TARGET; ++ return (ret); ++ } ++ ++ /* check for suspended/lost device */ ++ /* ++ if (ha->fcport is suspended/lost) { ++ pext->Status = EXT_STATUS_SUSPENDED; ++ pext->DetailStatus = EXT_DSTATUS_TARGET; ++ return pext->Status; ++ } ++ */ ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ /* Send mailbox cmd to get more. */ ++ if ((rval = qla2x00_get_link_status(ha, ha->fc_db[tgt].loop_id, ++ &stat_buf, mb_stat)) != QL_STATUS_SUCCESS) { ++ if (rval == BIT_0) { ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ } else if (rval == BIT_1) { ++ pext->Status = EXT_STATUS_MAILBOX; ++ pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO; ++ } else { ++ pext->Status = EXT_STATUS_ERR; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR mailbox failed. " ++ "mb[0]=%x.\n", ++ __func__, ha->host_no, ha->instance, mb_stat[0]);) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_stat, ++ sizeof(EXT_HBA_PORT_STAT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_PORT_STAT));) ++ return (ret); ++ } ++ ++ ptmp_stat->ControllerErrorCount = ha->total_isp_aborts; ++ ptmp_stat->DeviceErrorCount = ha->total_dev_errs; ++ ptmp_stat->TotalIoCount = ha->total_ios; ++ ptmp_stat->TotalMBytes = ha->total_bytes >> 20; ++ ptmp_stat->TotalLipResets = ha->total_lip_cnt; ++ /* ++ ptmp_stat->TotalInterrupts = ha->total_isr_cnt; ++ */ ++ ++ ptmp_stat->TotalLinkFailures = stat_buf.link_fail_cnt; ++ ptmp_stat->TotalLossOfSync = stat_buf.loss_sync_cnt; ++ ptmp_stat->TotalLossOfSignals = stat_buf.loss_sig_cnt; ++ ptmp_stat->PrimitiveSeqProtocolErrorCount = stat_buf.prim_seq_err_cnt; ++ ptmp_stat->InvalidTransmissionWordCount = stat_buf.inval_xmit_word_cnt; ++ ptmp_stat->InvalidCRCCount = stat_buf.inval_crc_cnt; ++ ++ /* now copy up the STATISTICS to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_PORT_STAT); ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ptmp_stat; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_port_summary ++ * Handles EXT_SC_GET_PORT_SUMMARY subcommand. ++ * Returns values of devicedata and dd_entry list. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_port_summary(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t b; ++ uint32_t i, port_cnt, entry; ++ uint32_t number_of_entries = 0; ++ uint32_t tgt_cnt, transfer_size; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ uint32_t current_offset; ++ void *start_of_entry_list; ++ ++ EXT_DEVICEDATA *pdevicedata; ++ EXT_DEVICEDATAENTRY *pdd_entry; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ port_cnt = 0; ++ tgt_cnt = 0; ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdevicedata, ++ sizeof(EXT_DEVICEDATA))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pdevicedata requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DEVICEDATA));) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdd_entry, ++ sizeof(EXT_DEVICEDATAENTRY))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pdd_entry requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DEVICEDATAENTRY));) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ port_cnt++; ++ } ++ pdevicedata->TotalDevices = port_cnt; ++ ++ number_of_entries = pext->ResponseLen / sizeof(EXT_DEVICEDATAENTRY); ++ ++ /* we want the lesser of port_cnt and number_of_entries */ ++ if (number_of_entries > port_cnt) ++ number_of_entries = port_cnt; ++ pdevicedata->ReturnListEntryCount = number_of_entries; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld EXT_SC_GET_PORT_SUMMARY port_cnt=%x, " ++ "return entry cnt=%x.\n", ++ __func__, ha->host_no, ha->instance, port_cnt, ++ number_of_entries);) ++ ++ transfer_size = sizeof(pdevicedata->ReturnListEntryCount) + ++ sizeof(pdevicedata->TotalDevices); ++ ++ /* copy top of devicedata here */ ++ ret = verify_area(VERIFY_WRITE, (void *)(pext->ResponseAdr), ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)pdevicedata; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp " ++ "devicedata buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ start_of_entry_list = (void *)(pext->ResponseAdr) + transfer_size; ++ ++ entry = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (entry >= number_of_entries) ++ break; ++ ++ /* copy from fc_db of this target (port) to dd_entry */ ++ ++ memcpy(pdd_entry->NodeWWN, fcport->node_name, WWN_SIZE); ++ memcpy(pdd_entry->PortWWN, fcport->port_name, WWN_SIZE); ++ ++ for (b = 0; b < 3 ; b++) ++ pdd_entry->PortID[b] = fcport->d_id.r.d_id[2-b]; ++ ++ if (fcport->flags & FC_FABRIC_DEVICE) { ++ pdd_entry->ControlFlags = EXT_DEF_GET_FABRIC_DEVICE; ++ } else { ++ pdd_entry->ControlFlags = 0; ++ } ++ ++ pdd_entry->TargetAddress.Bus = 0; ++ /* Retrieve 'Target' number for port via fc_db */ ++ for (i = 0; i < MAX_TARGETS; i++) { ++ if (ha->fc_db[i].loop_id == PORT_UNUSED) ++ continue; ++ ++ if (memcmp(fcport->port_name, ha->fc_db[i].wwn, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ pdd_entry->TargetAddress.Target = i; ++ break; ++ } ++ } ++ pdd_entry->TargetAddress.Lun = 0; ++ pdd_entry->DeviceFlags = 0; ++ pdd_entry->LoopID = fcport->loop_id; ++ pdd_entry->BaseLunNumber = 0; ++ ++ current_offset = entry * sizeof(EXT_DEVICEDATAENTRY); ++ ++ transfer_size = sizeof(EXT_DEVICEDATAENTRY); ++ ret = verify_area(VERIFY_WRITE, ++ (void *)(start_of_entry_list + current_offset), ++ transfer_size); ++ ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR verify WRITE " ++ "rsp bufaddr=%p\n", ++ __func__, ha->host_no, ha->instance, ++ (void *)(start_of_entry_list + current_offset));) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return pext->Status; ++ } ++ ++ /* now copy up this dd_entry to user */ ++ usr_temp = (uint8_t *)((u_long) start_of_entry_list + ++ current_offset); ++ kernel_tmp = (uint8_t *)pdd_entry; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp " ++ "entry list buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ entry++; ++ } /* for number_of_entries */ ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_driver ++ * Handles EXT_SC_QUERY_DRIVER subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_driver(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t transfer_size; ++ EXT_DRIVER *pdriver_prop; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdriver_prop, ++ sizeof(EXT_DRIVER))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DRIVER));) ++ return (ret); ++ } ++ ++ sprintf(pdriver_prop->Version, qla2x00_version_str); ++ pdriver_prop->NumOfBus = MAX_BUSES; ++ pdriver_prop->TargetsPerBus = MAX_FIBRE_DEVICES; ++ pdriver_prop->LunsPerTarget = MAX_LUNS; ++ pdriver_prop->MaxTransferLen = 0xffffffff; ++ pdriver_prop->MaxDataSegments = 0xffffffff; ++ ++ if (ha->flags.enable_64bit_addressing == 1) ++ pdriver_prop->DmaBitAddresses = 64; ++ else ++ pdriver_prop->DmaBitAddresses = 32; ++ ++ if (pext->ResponseLen < sizeof(EXT_DRIVER)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_DRIVER); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the ISP to user */ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)pdriver_prop; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_fw ++ * Handles EXT_SC_QUERY_FW subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_fw(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t transfer_size; ++ EXT_FW *pfw_prop; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfw_prop, ++ sizeof(EXT_FW))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_FW));) ++ return (ret); ++ } ++ ++ pfw_prop->Version[0] = ha->fw_major_version; ++ pfw_prop->Version[1] = ha->fw_minor_version; ++ pfw_prop->Version[2] = ha->fw_subminor_version; ++ ++ transfer_size = sizeof(EXT_FW); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)pfw_prop; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++#if defined(ISP2300) ++/* ++ * qla2x00_send_els_passthru ++ * Passes the ELS command down to firmware as MSIOCB and ++ * copies the response back when it completes. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_send_els_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int tmp_rval = 0; ++ ++ uint8_t index; ++ uint8_t invalid_wwn = FALSE; ++ uint8_t port_found; ++ uint8_t *ptmp_stat; ++ uint8_t *pusr_req_buf; ++ uint8_t *presp_payload; ++ uint32_t payload_len; ++ uint32_t usr_req_len; ++ ++ fcdev_t tmpdev; ++ ++ fc_lun_t *ptemp_fclun; /* buf from scrap mem */ ++ fc_port_t *ptemp_fcport; /* buf from scrap mem */ ++ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ os_lun_t *plq; ++ os_tgt_t *ptq; ++ ++ Scsi_Cmnd *pscsi_cmd; ++ ++ srb_t *sp = NULL; ++ EXT_ELS_PT_REQ *pels_pt_req; ++ ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on current topology */ ++ if ((ha->current_topology != ISP_CFG_F) && ++ (ha->current_topology != ISP_CFG_FL)) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR not in F or FL mode\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ if (ha->ioctl_mem_size <= 0) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, ++ QLA_INITIAL_IOCTLMEM_SIZE) != QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s: ERROR cannot alloc DMA " ++ "buffer size=%lx.\n", ++ __func__, QLA_INITIAL_IOCTLMEM_SIZE);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s: ERROR cannot alloc requested" ++ "DMA buffer size %x.\n", ++ __func__, pext->ResponseLen);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld rsp buf length larger than " ++ "existing size. Additional mem alloc successful.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ ++ usr_req_len = pext->RequestLen - sizeof(EXT_ELS_PT_REQ); ++ if (usr_req_len > ha->ioctl_mem_size) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR ReqLen too big=%x.\n", ++ __func__, ha->host_no, ha->instance, pext->RequestLen);) ++ ++ return (ret); ++ } ++ ++ /* Verify entire EXT IOCTL request buffer */ ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify read req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld req buf verified.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ return (ret); ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pels_pt_req, ++ sizeof(EXT_ELS_PT_REQ))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "els_pt_req size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_ELS_PT_REQ));) ++ goto els_passthru_done; ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fclun, ++ sizeof(fc_lun_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fclun size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_lun_t));) ++ goto els_passthru_done; ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fcport, ++ sizeof(fc_port_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fcport size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_port_t));) ++ goto els_passthru_done; ++ } ++ ++ /* initialize */ ++ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ /* copy request buffer */ ++ ++ ret = copy_from_user(pels_pt_req, pext->RequestAdr, ++ sizeof(EXT_ELS_PT_REQ)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR" ++ "copy_from_user() of struct failed (%d).\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ ++ goto els_passthru_done; ++ } ++ ++ pusr_req_buf = (uint8_t *)pext->RequestAdr + sizeof(EXT_ELS_PT_REQ); ++ ++ ret = copy_from_user(ha->ioctl_mem, pusr_req_buf, usr_req_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR" ++ "copy_from_user() of request buf failed (%d).\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on loop down (1) */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ABORTS_ACTIVE) { ++ ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld before dest port validation- loop not " ++ "ready; cannot proceed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ ++ goto els_passthru_done; ++ } ++ ++ /*********************************/ ++ /* Validate the destination port */ ++ /*********************************/ ++ ++ /* first: WWN cannot be zero if no PID is specified */ ++ invalid_wwn = qla2x00_is_wwn_zero(pels_pt_req->WWPN); ++ if (invalid_wwn && !(pels_pt_req->ValidMask & EXT_DEF_PID_VALID)) { ++ /* error: both are not set. */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no valid WWPN/PID\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* second: it cannot be the local/current HBA itself */ ++ if (!invalid_wwn) { ++ if (memcmp(ha->init_cb->port_name, pels_pt_req->WWPN, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ++ /* local HBA specified. */ ++ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR local HBA's " ++ "WWPN found.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ } else { /* using PID */ ++ if (pels_pt_req->Id[1] == ha->d_id.r.d_id[2] ++ && pels_pt_req->Id[2] == ha->d_id.r.d_id[1] ++ && pels_pt_req->Id[3] == ha->d_id.r.d_id[0]) { ++ ++ /* local HBA specified. */ ++ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR local HBA's " ++ "PID found.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ } ++ ++ /************************/ ++ /* Now find the loop ID */ ++ /************************/ ++ ++ /* 1st: scan thru our HBA database */ ++ index = 0; ++ port_found = FALSE; ++ fcinitiator = NULL; ++ if (!invalid_wwn) { ++ /* search with WWPN */ ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(pels_pt_req->WWPN, fcinitiator->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcinitiator->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found host " ++ "w/ WWN. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ ++ break; ++ } ++ } ++ } else { ++ /* search with PID */ ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (pels_pt_req->Id[1] == fcinitiator->d_id.r.d_id[2] ++ && pels_pt_req->Id[2] == fcinitiator->d_id.r.d_id[1] ++ && pels_pt_req->Id[3] == ++ fcinitiator->d_id.r.d_id[0]) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcinitiator->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found host " ++ "w/ WWN. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ ++ break; ++ } ++ } ++ } ++ ++ /* If this is for a host device, check if we need to perform login */ ++ if (port_found && (fcinitiator->loop_id >= LAST_SNS_LOOP_ID)) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld need to relogin to " ++ "dest host.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (fcinitiator->d_id.b24 == 0) { ++ /* Either RSCN hasn't been processed yet or ++ * this host is no longer connected to us. ++ */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR dest host " ++ "port lost.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* login and update database */ ++ tmpdev.d_id.b24 = fcinitiator->d_id.b24; ++ tmpdev.loop_id = fcinitiator->loop_id; ++ ++ if (qla2x00_host_relogin(ha, &tmpdev) != 0) { ++ /* login failed. */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR login to " ++ "host port failed. loop_id=%02x pid=%02x%02x%02x " ++ "ret=%d.\n", ++ __func__, ha->host_no, ha->instance, tmpdev.loop_id, ++ tmpdev.d_id.b.domain, ++ tmpdev.d_id.b.area, ++ tmpdev.d_id.b.al_pa, ++ ret);) ++ ++ goto els_passthru_done; ++ } else { ++ fcinitiator->loop_id = tmpdev.loop_id; ++ pels_pt_req->Lid = tmpdev.loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld success login to " ++ "remote host; Lid=%02x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcinitiator->loop_id);) ++ } ++ } ++ ++ /* 2nd: scan thru our fcport database */ ++ if (!invalid_wwn && !port_found) { ++ /* search with WWPN */ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (memcmp(fcport->port_name, pels_pt_req->WWPN, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcport->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found fcport " ++ "w/ WWN. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ break; ++ } ++ } ++ } else if (!port_found) { ++ /* search with PID */ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (pels_pt_req->Id[1] == fcport->d_id.r.d_id[2] ++ && pels_pt_req->Id[2] == fcport->d_id.r.d_id[1] ++ && pels_pt_req->Id[3] == fcport->d_id.r.d_id[0]) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcport->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found fcport " ++ "w/ PID. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ ++ break; ++ } ++ } ++ } ++ ++ if (!port_found) { ++ /* invalid WWN or PID specified */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR WWPN/PID invalid.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* alloc sp */ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s: ERROR cannot alloc sp %p.\n", ++ __func__, sp);) ++ ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after alloc sp.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* setup sp for this command */ ++ ptq = ha->ioctl->ioctl_tq; ++ plq = ha->ioctl->ioctl_lq; ++ sp->cmd = pscsi_cmd; ++ sp->flags = SRB_IOCTL; ++ sp->lun_queue = plq; ++ sp->tgt_queue = ptq; ++ ptemp_fclun->fcport = ptemp_fcport; ++ ptemp_fclun->lun = 0; ++ ptemp_fclun->flags = 0; ++ plq->fclun = ptemp_fclun; ++ plq->fclun->fcport->ha = ha; ++ ++ /* init scsi_cmd */ ++ pscsi_cmd->device->host = ha->host; ++ pscsi_cmd->scsi_done = qla2x00_msiocb_done; ++ ++ /* check on loop down (2)- check again just before sending cmd out. */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld before issue cmd- loop " ++ "not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld going to issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ tmp_rval = qla2x00_start_ms_cmd(ha, pext, sp, pels_pt_req); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (tmp_rval != 0) { ++ /* We waited and post function did not get called */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld command timed out.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_MS_NO_RESPONSE; ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto els_passthru_done; ++ } ++ ++ /* check on data returned */ ++ ptmp_stat = (uint8_t *)ha->ioctl_mem + FC_HEADER_LEN; ++ ++ if (*ptmp_stat == ELS_STAT_LS_RJT) { ++ payload_len = FC_HEADER_LEN + ELS_RJT_LENGTH; ++ ++ } else if (*ptmp_stat == ELS_STAT_LS_ACC) { ++ payload_len = pext->ResponseLen - sizeof(EXT_ELS_PT_REQ); ++ ++ } else { ++ /* invalid. just copy the status word. */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid stat " ++ "returned =0x%x.\n", ++ __func__, ha->host_no, ha->instance, *ptmp_stat);) ++ ++ payload_len = FC_HEADER_LEN + 4; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld data dump-\n", ++ __func__, ha->host_no, ha->instance);) ++ DEBUG9(qla2x00_dump_buffer((uint8_t *)ptmp_stat, ++ pext->ResponseLen - sizeof(EXT_ELS_PT_REQ) - FC_HEADER_LEN);) ++ ++ /* Verify response buffer to be written */ ++ /* The data returned include FC frame header */ ++ presp_payload = (uint8_t *)pext->ResponseAdr + sizeof(EXT_ELS_PT_REQ); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)presp_payload, payload_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp " ++ "buffer. ha=%p.\n", ++ __func__, ha->host_no, ha->instance, ha);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* copy back data returned to response buffer */ ++ ret = copy_to_user(presp_payload, (uint8_t *)ha->ioctl_mem, ++ payload_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++els_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++#endif ++ ++/* ++ * qla2x00_send_fcct ++ * Passes the FC CT command down to firmware as MSIOCB and ++ * copies the response back when it completes. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_send_fcct(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int tmp_rval = 0; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ ++ fc_lun_t *ptemp_fclun; ++ fc_port_t *ptemp_fcport; ++ ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ ++ Scsi_Cmnd *pscsi_cmd; ++ srb_t *sp = NULL; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on current topology */ ++ if ((ha->current_topology != ISP_CFG_F) && ++ (ha->current_topology != ISP_CFG_FL)) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR not in F or FL mode\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ if (ha->ioctl_mem_size <= 0) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, ++ QLA_INITIAL_IOCTLMEM_SIZE) != QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "DMA buffer size=%lx.\n", ++ __func__, ha->host_no, ha->instance, ++ QLA_INITIAL_IOCTLMEM_SIZE);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "requested DMA buffer size %x.\n", ++ __func__, ha->host_no, ha->instance, ++ pext->ResponseLen);) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld rsp buf len larger than " ++ "existing size. Additional mem alloc successful.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ ++ if (pext->RequestLen > ha->ioctl_mem_size) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR ReqLen too big=%x.\n", ++ __func__, ha->host_no, ha->instance, pext->RequestLen);) ++ ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify read req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld req buf verified.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ return (ret); ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fclun, ++ sizeof(fc_lun_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fclun size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_lun_t));) ++ goto fcct_passthru_done; ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fcport, ++ sizeof(fc_port_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fcport size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_port_t));) ++ goto fcct_passthru_done; ++ } ++ ++ /* initialize */ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ /* copy request buffer */ ++ ret = copy_from_user(ha->ioctl_mem, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf. ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ ++ ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* alloc sp */ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "sp %p.\n", ++ __func__, ha->host_no, ha->instance, sp);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after alloc sp.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* setup sp for this command */ ++ tq = ha->ioctl->ioctl_tq; ++ lq = ha->ioctl->ioctl_lq; ++ sp->cmd = pscsi_cmd; ++ sp->flags = SRB_IOCTL; ++ sp->lun_queue = lq; ++ sp->tgt_queue = tq; ++ ptemp_fclun->fcport = ptemp_fcport; ++ ptemp_fclun->lun = 0; ++ ptemp_fclun->flags = 0; ++ lq->fclun = ptemp_fclun; ++ lq->fclun->fcport->ha = ha; ++ ++ /* init scsi_cmd */ ++ pscsi_cmd->device->host = ha->host; ++ pscsi_cmd->scsi_done = qla2x00_msiocb_done; ++ ++ /* check on management server login status */ ++ if (ha->flags.management_server_logged_in == 0) { ++ /* login to management server device */ ++ ++ tmp_rval = qla2x00_login_fabric(ha, MANAGEMENT_SERVER, ++ 0xff, 0xff, 0xfa, &mb[0], BIT_1); ++ ++ if (tmp_rval != 0 || mb[0] != 0x4000) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR login to MS.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fcct_passthru_done; ++ } ++ ++ ha->flags.management_server_logged_in = 1; ++ } ++ ++ DEBUG9(printk("%s(%ld): success login to MS.\n", ++ __func__, ha->host_no);) ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE) { ++ ++ DEBUG10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld going to issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ tmp_rval = qla2x00_start_ms_cmd(ha, pext, sp, NULL); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (tmp_rval != 0) { ++ /* We waited and post function did not get called */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld command timed out.\n", ++ __func__, ha->host_no, ha->instance);) ++ pext->Status = EXT_STATUS_MS_NO_RESPONSE; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fcct_passthru_done; ++ } ++ ++ if (CMD_COMPL_STATUS(pscsi_cmd) != 0 || ++ CMD_ENTRY_STATUS(pscsi_cmd) != 0) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld cmd returned error=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd));) ++ pext->Status = EXT_STATUS_ERR; ++ goto fcct_passthru_done; ++ } ++ ++ /* getting device data and putting in pext->ResponseAdr */ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp " ++ "buffer. ha=%p.\n", ++ __func__, ha->host_no, ha->instance, ha);) ++ goto fcct_passthru_done; ++ } ++ ++ /* sending back data returned from Management Server */ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ha->ioctl_mem, pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++fcct_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_start_ms_cmd ++ * Allocates an MSIOCB request pkt and sends out the passthru cmd. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_start_ms_cmd(scsi_qla_host_t *ha, EXT_IOCTL *pext, srb_t *sp, ++ EXT_ELS_PT_REQ *pels_pt_req) ++{ ++#define ELS_REQUEST_RCTL 0x22 ++#define ELS_REPLY_RCTL 0x23 ++ ++ uint32_t usr_req_len; ++ uint32_t usr_resp_len; ++ uint64_t usr_reqbuf_addr; ++ ++ ms_iocb_entry_t *pkt; ++ unsigned long cpu_flags = 0; ++ ++ ++ /* get spin lock for this operation */ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ ++ /* Get MS request packet. */ ++ pkt = (ms_iocb_entry_t *)qla2x00_ms_req_pkt(ha, sp); ++ if (pkt == NULL) { ++ /* release spin lock and return error. */ ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG10(printk("%s(%ld): inst=%ld MSIOCB PT - could not get " ++ "Request Packet.\n", __func__, ha->host_no, ha->instance);) ++ return (QL_STATUS_RESOURCE_ERROR); ++ } ++ ++ pkt->entry_type = MS_IOCB_TYPE; ++ pkt->entry_count = 1; ++ ++ if (pels_pt_req != NULL) { ++ /* process ELS passthru command */ ++ usr_reqbuf_addr = (uint64_t)ha->ioctl_mem_phys + ++ sizeof(EXT_ELS_PT_REQ); ++ usr_req_len = pext->RequestLen - sizeof(EXT_ELS_PT_REQ); ++ usr_resp_len = pext->ResponseLen - sizeof(EXT_ELS_PT_REQ); ++ ++ pkt->control_flags = BIT_15; /* ELS passthru enabled */ ++ pkt->loop_id = pels_pt_req->Lid; ++ pkt->type = 1; /* ELS frame */ ++ ++ if (pext->ResponseLen != 0) { ++ pkt->r_ctl = ELS_REQUEST_RCTL; ++ pkt->rx_id = 0; ++ } else { ++ pkt->r_ctl = ELS_REPLY_RCTL; ++ pkt->rx_id = pels_pt_req->Rxid; ++ } ++ } else { ++ usr_reqbuf_addr = (uint64_t)ha->ioctl_mem_phys; ++ usr_req_len = pext->RequestLen; ++ usr_resp_len = pext->ResponseLen; ++ pkt->loop_id = MANAGEMENT_SERVER; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld using loop_id=%02x req_len=%d, " ++ "resp_len=%d.\n", __func__, ha->host_no, ha->instance, ++ pkt->loop_id, usr_req_len, usr_resp_len);) ++ ++ pkt->timeout = QLA_PT_CMD_TOV; ++ pkt->cmd_dsd_count = 1; ++ pkt->total_dsd_count = 2; /* no continuation */ ++ pkt->rsp_bytecount = usr_resp_len; ++ pkt->req_bytecount = usr_req_len; ++ ++ /* loading command payload address */ ++ pkt->dseg_req_address[0] = LSD(usr_reqbuf_addr); ++ pkt->dseg_req_address[1] = MSD(usr_reqbuf_addr); ++ pkt->dseg_req_length = usr_req_len; ++ ++ /* loading response payload address */ ++ pkt->dseg_rsp_address[0] = LSD(ha->ioctl_mem_phys); ++ pkt->dseg_rsp_address[1] = MSD(ha->ioctl_mem_phys); ++ pkt->dseg_rsp_length = usr_resp_len; ++ ++ /* set flag to indicate IOCTL MSIOCB cmd in progress */ ++ ha->ioctl->MSIOCB_InProgress = 1; ++ ha->ioctl->ioctl_tov = pkt->timeout + 1; /* 1 second more */ ++ ++ /* prepare for receiving completion. */ ++ qla2x00_ioctl_sem_init(ha); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; ++ add_timer(&ha->ioctl->cmpl_timer); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld releasing hardware_lock.\n", ++ __func__, ha->host_no, ha->instance);) ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld sleep for completion.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ down(&ha->ioctl->cmpl_sem); ++ ++ del_timer(&ha->ioctl->cmpl_timer); ++ ++ if (ha->ioctl->MSIOCB_InProgress == 1) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld timed out. exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ return QL_STATUS_ERROR; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_wwpn_to_scsiaddr ++ * Handles the EXT_CC_WWPN_TO_SCSIADDR command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ fc_port_t *tgt_fcport; ++ os_tgt_t *tq; ++ uint8_t tmp_wwpn[EXT_DEF_WWN_NAME_SIZE]; ++ uint32_t b, tgt, l; ++ EXT_SCSI_ADDR tmp_addr; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (pext->RequestLen != EXT_DEF_WWN_NAME_SIZE || ++ pext->ResponseLen < sizeof(EXT_SCSI_ADDR)) { ++ /* error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid WWN buffer size %d " ++ "received.\n", ++ __func__, ha->host_no, ha->instance, pext->ResponseLen);) ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (ret) { ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR VERIFY_READ req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ return (ret); ++ } ++ ++ ret = copy_from_user(tmp_wwpn, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy_from_user " ++ "failed(%d) on request buf.\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ return (ret); ++ } ++ ++ tq = NULL; ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if (ha->otgt[tgt] == NULL) { ++ continue; ++ } ++ ++ tq = ha->otgt[tgt]; ++ if (tq->vis_port == NULL) { ++ break; ++ } ++ ++ tgt_fcport = tq->vis_port; ++ if (memcmp(tmp_wwpn, tgt_fcport->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ break; ++ } ++ } ++ ++ if (tq == NULL || tgt >= MAX_TARGETS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. " ++ "tq=%p, tgt=%x.\n", __func__, ha->host_no, ha->instance, ++ tq, tgt);) ++ return (ret); ++ } ++ ++ if (tq->vis_port == NULL) { /* dg 08/14/01 */ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target port not found. " ++ "tq=%p, tgt=%x.\n", ++ __func__, ha->host_no, ha->instance, tq, tgt);) ++ return (ret); ++ } ++ ++ /* Currently we only have bus 0 and no translation on LUN */ ++ b = 0; ++ l = 0; ++ ++ /* ++ * Return SCSI address. Currently no translation is done for ++ * LUN. ++ */ ++ tmp_addr.Bus = b; ++ tmp_addr.Target = tgt; ++ tmp_addr.Lun = l; ++ if (pext->ResponseLen > sizeof(EXT_SCSI_ADDR)) ++ pext->ResponseLen = sizeof(EXT_SCSI_ADDR); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, &tmp_addr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ DEBUG9(printk(KERN_INFO ++ "%s(%ld): Found t%d l%d for %02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ __func__, ha->host_no, ++ tmp_addr.Target, tmp_addr.Lun, ++ tmp_wwpn[0], tmp_wwpn[1], tmp_wwpn[2], tmp_wwpn[3], ++ tmp_wwpn[4], tmp_wwpn[5], tmp_wwpn[6], tmp_wwpn[7]);) ++ ++ pext->Status = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_scsi_passthru ++ * Handles all subcommands of the EXT_CC_SEND_SCSI_PASSTHRU command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int tmp_rval = 0; ++ ++ switch(pext->SubCode) { ++ case EXT_SC_SEND_SCSI_PASSTHRU: ++ tmp_rval = qla2x00_sc_scsi_passthru(ha, pext, mode); ++ break; ++ case EXT_SC_SEND_FC_SCSI_PASSTHRU: ++ tmp_rval = qla2x00_sc_fc_scsi_passthru(ha, pext, mode); ++ break; ++ case EXT_SC_SCSI3_PASSTHRU: ++ tmp_rval = qla2x00_sc_scsi3_passthru(ha, pext, mode); ++ break; ++ default: ++ break; ++ } ++ ++ return tmp_rval; ++} ++ ++/* ++ * qla2x00_sc_scsi_passthru ++ * Handles EXT_SC_SEND_SCSI_PASSTHRU subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_sc_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint8_t scsi_direction; ++ uint32_t i; ++ ++#if defined(QL_DEBUG_LEVEL_9) ++ uint32_t b, t, l; ++#endif ++ uint32_t transfer_len; ++ ++ EXT_SCSI_PASSTHRU *pscsi_pass; ++ ++ Scsi_Cmnd *pscsi_cmd; ++ Scsi_Device *pscsi_device; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ " ++ "req buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "requested DMA buffer size %x.\n", ++ __func__, ha->host_no, ha->instance, ++ pext->ResponseLen);) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_pass, ++ sizeof(EXT_SCSI_PASSTHRU))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_SCSI_PASSTHRU));) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pscsi_cmd requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ goto scsi_passthru_done; ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_device, ++ sizeof(Scsi_Device))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pscsi_device requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Device));) ++ goto scsi_passthru_done; ++ } ++ ++ /* clear ioctl_mem to be used */ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ /* Copy request buffer */ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pscsi_pass; ++ ret = copy_from_user(kernel_tmp, usr_temp, sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ goto scsi_passthru_done; ++ } ++ ++ /* set target coordinates */ ++ pscsi_cmd->device->id = pscsi_pass->TargetAddr.Target; ++ pscsi_cmd->device->lun = pscsi_pass->TargetAddr.Lun; ++ ++ /* Verify target exists */ ++ if (TGT_Q(ha, pscsi_cmd->device->id) == NULL) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR tgt %d not found.\n", ++ __func__, ++ ha->host_no, ha->instance, pscsi_cmd->device->id)); ++ goto scsi_passthru_done; ++ } ++ ++ /* Copy over cdb */ ++ ++ if (pscsi_pass->CdbLength == 6) { ++ pscsi_cmd->cmd_len = 6; ++ ++ } else if (pscsi_pass->CdbLength == 10) { ++ pscsi_cmd->cmd_len = 0x0A; ++ ++ } else if (pscsi_pass->CdbLength == 12) { ++ pscsi_cmd->cmd_len = 0x0C; ++ ++ } else { ++ printk(KERN_WARNING ++ "%s: Unsupported Cdb Length=%x.\n", ++ __func__, pscsi_pass->CdbLength); ++ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ goto scsi_passthru_done; ++ } ++ ++ memcpy(pscsi_cmd->data_cmnd, pscsi_pass->Cdb, pscsi_cmd->cmd_len); ++ memcpy(pscsi_cmd->cmnd, pscsi_pass->Cdb, pscsi_cmd->cmd_len); ++ ++ DEBUG9(printk("%s Dump of cdb buffer:\n", __func__);) ++ DEBUG9(qla2x00_dump_buffer((uint8_t *)&pscsi_cmd->data_cmnd[0], ++ pscsi_cmd->cmd_len);) ++ ++ pscsi_cmd->device->host = ha->host; ++ ++ /* mark this as a special delivery and collection command */ ++ pscsi_cmd->flags = 0; ++ pscsi_cmd->scsi_done = qla2x00_scsi_pt_done; ++ ++ pscsi_cmd->device = pscsi_device; ++ pscsi_cmd->device->tagged_queue = 0; ++ pscsi_cmd->use_sg = 0; /* no ScatterGather */ ++ pscsi_cmd->request_bufflen = pext->ResponseLen; ++ pscsi_cmd->request_buffer = ha->ioctl_mem; ++ pscsi_cmd->timeout_per_command = QLA_PT_CMD_TOV * HZ; ++ CMD_RESID_LEN(pscsi_cmd) = SRB_IOCTL; /* Used to set sp->flags later */ ++ ++ if (pscsi_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) { ++ /* sending user data from pext->ResponseAdr to device */ ++ ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ " ++ "rsp buf.\n", __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ pscsi_cmd->sc_data_direction = SCSI_DATA_WRITE; ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf " ++ "failed(%d).\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ goto scsi_passthru_done; ++ } ++ } else { ++ pscsi_cmd->sc_data_direction = SCSI_DATA_READ; ++ } ++ ++ DEBUG9({ ++ b = SCSI_BUS_32(pscsi_cmd); ++ t = SCSI_TCN_32(pscsi_cmd); ++ l = SCSI_LUN_32(pscsi_cmd); ++ }) ++ DEBUG9(printk("%s(%ld): CDB=%02x %02x %02x %02x; b=%x t=%x l=%x.\n", ++ __func__, ha->host_no, pscsi_cmd->cmnd[0], pscsi_cmd->cmnd[1], ++ pscsi_cmd->cmnd[2], pscsi_cmd->cmnd[3], b, t, l);) ++ ++ /* ++ * Check the status of the port ++ */ ++ if (qla2x00_check_tgt_status(ha, pscsi_cmd) != QL_STATUS_SUCCESS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld check_tgt_status " ++ "failed.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ /* set flag to indicate IOCTL SCSI PassThru in progress */ ++ ha->ioctl->SCSIPT_InProgress = 1; ++ ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV; ++ ++ /* prepare for receiving completion. */ ++ qla2x00_ioctl_sem_init(ha); ++ CMD_COMPL_STATUS(pscsi_cmd) = (int) IOCTL_INVALID_STATUS; ++ ++ /* send command to adapter */ ++ DEBUG9(printk("%s(%ld): inst=%ld sending command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* get spin lock for this operation */ ++ spin_lock_irqsave(ha->host->host_lock, ha->cpu_flags); ++ ++ qla2x00_queuecommand(pscsi_cmd, (void *) qla2x00_scsi_pt_done); ++ ++ ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; ++ add_timer(&ha->ioctl->cmpl_timer); ++ ++ spin_unlock_irqrestore(ha->host->host_lock, ha->cpu_flags); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld waiting for completion.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ down(&ha->ioctl->cmpl_sem); ++ ++ del_timer(&ha->ioctl->cmpl_timer); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld completed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (ha->ioctl->SCSIPT_InProgress == 1) { ++ ++ printk(KERN_WARNING ++ "qla2x00: scsi%ld ERROR passthru command timeout.\n", ++ ha->host_no); ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ goto scsi_passthru_done; ++ } ++ ++ if (CMD_COMPL_STATUS(pscsi_cmd) == (int)IOCTL_INVALID_STATUS) { ++ ++ DEBUG9(printk("%s(%ld): inst=%ld ERROR - cmd not completed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_ERR; ++ goto scsi_passthru_done; ++ } ++ ++ switch (CMD_COMPL_STATUS(pscsi_cmd)) { ++ case CS_INCOMPLETE: ++ case CS_ABORTED: ++ case CS_PORT_UNAVAILABLE: ++ case CS_PORT_LOGGED_OUT: ++ case CS_PORT_CONFIG_CHG: ++ case CS_PORT_BUSY: ++ DEBUG9_10(printk("%s(%ld): inst=%ld cs err = %x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd));) ++ pext->Status = EXT_STATUS_BUSY; ++ ++ goto scsi_passthru_done; ++ } ++ ++ if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) || ++ (CMD_SCSI_STATUS(pscsi_cmd) != 0)) { ++ ++ /* have done the post function */ ++ pext->Status = EXT_STATUS_SCSI_STATUS; ++ pext->DetailStatus = CMD_SCSI_STATUS(pscsi_cmd) & 0xff; ++ DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. " ++ "host status =0x%x, scsi status = 0x%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd), CMD_SCSI_STATUS(pscsi_cmd));) ++ ++ } else if (CMD_COMPL_STATUS(pscsi_cmd) != 0) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld cs err=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd));) ++ pext->Status = EXT_STATUS_ERR; ++ goto scsi_passthru_done; ++ } ++ ++ /* copy up structure to make sense data available to user */ ++ pscsi_pass->SenseLength = CMD_ACTUAL_SNSLEN(pscsi_cmd); ++ if (CMD_ACTUAL_SNSLEN(pscsi_cmd)) { ++ for (i = 0; i < CMD_ACTUAL_SNSLEN(pscsi_cmd); i++) ++ pscsi_pass->SenseData[i] = pscsi_cmd->sense_buffer[i]; ++ ++ DEBUG10(printk("%s Dump of sense buffer:\n", __func__);) ++ DEBUG10(qla2x00_dump_buffer( ++ (uint8_t *)&pscsi_pass->SenseData[0], ++ CMD_ACTUAL_SNSLEN(pscsi_cmd));) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr, ++ sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " ++ "req buf.\n", __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pscsi_pass; ++ ret = copy_to_user(usr_temp, kernel_tmp, ++ sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense " ++ "buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ } ++ ++ scsi_direction = pscsi_pass->Direction; ++ ++ if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) { ++ DEBUG9(printk("%s(%ld): inst=%ld copying data.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* getting device data and putting in pext->ResponseAdr */ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write " ++ "ResponseAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ /* now copy up the READ data to user */ ++ if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) && ++ (CMD_RESID_LEN(pscsi_cmd))) { ++ ++ transfer_len = pext->ResponseLen - ++ CMD_RESID_LEN(pscsi_cmd); ++ ++ pext->ResponseLen = transfer_len; ++ } else { ++ transfer_len = pext->ResponseLen; ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy rsp buf\n", ++ __func__, ha->host_no, ha->